尝试将 HTML 表转换为带有属性的 XML - 选择标题和数据

发布于 2024-12-21 14:38:10 字数 894 浏览 2 评论 0原文

我有一个简单的 HTML 输入文件;其中包含一个表。 HTML 表格的列标题在第 2 行中定义;第 2+ 行的数据如下。

所以我正在获取这样的数据:(

<xsl:template match="HTML">
    <xsl:apply-templates select="//TABLE/TR[position() > 2]"/>
</xsl:template>

<xsl:template match="TR">
    <xsl:apply-templates select="TD"/>
</xsl:template>



   <xsl:template match="TD">
    <xsl:variable name="pos"><xsl:value-of select="position()"/></xsl:variable>
    <xsl:value-of select="normalize-space(.)"/>
        <xsl:text>&#10;</xsl:text>
        <xsl:value-of select="/HTML//TABLE/TR[2]/TD[$pos]"/>
    </xsl:template>

最后一个模板是调试版本;我之后的最终输出是使用标头信息来生成动态属性名称)

我正在努力获取的是 $ pos 变量来索引文档上的 TR[2]:它似乎总是等于“1”;最初我只是尝试使用“position()”和索引,但这对我不起作用。

我知道(如果我执行“xsl:value-of”)$pos 正在正确更改,但在谓词内它似乎崩溃为 1 ....

我需要在这里做什么...

I have a simple HTML input file; which contains a table.
The column headers of the HTML table are defined in row 2; and the data follows for row 2+.

So I'm picking up the data like this:

<xsl:template match="HTML">
    <xsl:apply-templates select="//TABLE/TR[position() > 2]"/>
</xsl:template>

<xsl:template match="TR">
    <xsl:apply-templates select="TD"/>
</xsl:template>



   <xsl:template match="TD">
    <xsl:variable name="pos"><xsl:value-of select="position()"/></xsl:variable>
    <xsl:value-of select="normalize-space(.)"/>
        <xsl:text>
</xsl:text>
        <xsl:value-of select="/HTML//TABLE/TR[2]/TD[$pos]"/>
    </xsl:template>

(This last template is a debug version; the final output I'm after is to use the header information to generate dynamic attribute names)

What I'm struggling to get, is the $pos variable to index the TR[2] on the document: it always seems to equate to '1'; originally I just trying using 'position()' and the index, but this doesn't work for me.

I know (if I do an 'xsl:value-of') that $pos is correctly changing, but within the predicate it seems to collapse into a 1 ....

What do I need to do here....

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

屋檐 2024-12-28 14:38:10

问题就在这里

/HTML//TABLE/TR[2]/TD[$pos]

在 XPath 中,必须知道 $x 是一个数字,只有这样 someElement[$x] 才是被视为 someElement[position() = $x] 的快捷方式

在 XSLT 1.0 / XPath 1.0 中只有基本的弱类型 和 a 的类型变量不能被指定并且不是众所周知。

这就是为什么,这个 XPath 表达式

/HTML//TABLE/TR[2]/TD[$pos]

被解释为

/HTML//TABLE/TR[2]/TD[boolean($pos)]

并选择作为 TRTD 元素> 元素是任何 TABLE 元素的第二个 TR 子元素,该元素是 XML 文档顶部元素的后代。

解决方案

在 XPath 1.0 中使用完整的未缩写表达式

/HTML//TABLE/TR[2]/TD[position() = $pos]

或使用较短的

/HTML//TABLE/TR[2]/TD[number($pos)]

在 XPath 2.0 (XSLT 2.0) 中,明确指定变量的类型

<xsl:variable name="pos" as="xs:integer" select="position()"/>

然后可以在以下位置使用它并正确地将其识别为 xs:integer

/HTML//TABLE/TR[2]/TD[$pos]

The problem is here:

/HTML//TABLE/TR[2]/TD[$pos]

In XPath it must be known that $x is a number and only then someElement[$x] is treated as a shortcut to someElement[position() = $x]

In XSLT 1.0 / XPath 1.0 there is only rudimentary, weak typing and the type of a variable cannot be specified and isn't generally known.

This is why, this XPath expression:

/HTML//TABLE/TR[2]/TD[$pos]

is interpreted as:

/HTML//TABLE/TR[2]/TD[boolean($pos)]

and selects all TD elements that are children of the TR element that is the second TR child of any TABLE element that is a descendant of the top element of the XML document.

Solution:

In XPath 1.0 use either the full unabbreviated expression:

/HTML//TABLE/TR[2]/TD[position() = $pos]

or use the shorter:

/HTML//TABLE/TR[2]/TD[number($pos)]

In XPath 2.0 (XSLT 2.0), explicitly specify the type of the variable:

<xsl:variable name="pos" as="xs:integer" select="position()"/>

and then it can be used and correctly known to be an xs:integer in:

/HTML//TABLE/TR[2]/TD[$pos]
↙厌世 2024-12-28 14:38:10

知道了;出于某种原因,我必须使用数字函数强制转换(强制?) $pos :

<xsl:value-of select="/HTML//TABLE/TR[2]/TD[number($pos)]"/>

我仍然无法在这个谓词中直接使用position() - 大概是因为不清楚我在谈论哪个position()?

Got it; for some reason I have to cast (coerce?) the $pos with the number function:

<xsl:value-of select="/HTML//TABLE/TR[2]/TD[number($pos)]"/>

I am still unable to use position() directly in this predicate - presumably because it is not clear which position() I'm talking about ?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文