尝试将 HTML 表转换为带有属性的 XML - 选择标题和数据
我有一个简单的 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> </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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
问题就在这里:
在 XPath 中,必须知道
$x
是一个数字,只有这样someElement[$x]
才是被视为someElement[position() = $x]
的快捷方式在 XSLT 1.0 / XPath 1.0 中只有基本的弱类型 和 a 的类型变量不能被指定并且不是众所周知。
这就是为什么,这个 XPath 表达式:
被解释为:
并选择作为
TR
TD 元素> 元素是任何TABLE
元素的第二个TR
子元素,该元素是 XML 文档顶部元素的后代。解决方案:
在 XPath 1.0 中使用完整的未缩写表达式:
或使用较短的:
在 XPath 2.0 (XSLT 2.0) 中,明确指定变量的类型:
然后可以在以下位置使用它并正确地将其识别为
xs:integer
:The problem is here:
In XPath it must be known that
$x
is a number and only thensomeElement[$x]
is treated as a shortcut tosomeElement[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:
is interpreted as:
and selects all
TD
elements that are children of theTR
element that is the secondTR
child of anyTABLE
element that is a descendant of the top element of the XML document.Solution:
In XPath 1.0 use either the full unabbreviated expression:
or use the shorter:
In XPath 2.0 (XSLT 2.0), explicitly specify the type of the variable:
and then it can be used and correctly known to be an
xs:integer
in:知道了;出于某种原因,我必须使用数字函数强制转换(强制?) $pos :
我仍然无法在这个谓词中直接使用position() - 大概是因为不清楚我在谈论哪个position()?
Got it; for some reason I have to cast (coerce?) the $pos with the number function:
I am still unable to use position() directly in this predicate - presumably because it is not clear which position() I'm talking about ?