我正在尝试根据xml文件的2个节点创建一个包含3列的表,如http://jsfiddle.net/4n36W/
XML
<Root>
<Items>
<a>10</a>
<b>20</b>
<c>30</c>
</Items>
<Errors>
<a>1</a>
<b>2</b>
<c>3</c>
</Errors>
</Root>
我的xsl文件看起来像这样,从我在stackoverflow的一些帖子中找到的。使用此文件,我有以下错误:
XPTY0020: Required item type of the context item for the child axis is node(); supplied value has item type xs:integer
XSL
<table>
<thead>
<tr>
<th>Column A</th>
<th>Column B</th>
<th>Column C</th>
</tr>
</thead>
<tbody>
<xsl:for-each select="1 to 3">
<xsl:variable name="pos" select="position()" />
<tr>
<td>
<!-- <xsl:value-of select="Root/Items/local-name()" /> -->
</td>
<td>
<xsl:value-of select="(Root/Items/*)[position()=$pos]" />
</td>
<td>
<xsl:value-of select="(Root/Errors/*)[position()=$pos]" />
</td>
</tr>
</xsl:for-each>
</tbody>
</table>
答案 0 :(得分:2)
我会通过迭代Items/*
元素并按位置提取匹配的Errors
子项来区别对待:
<xsl:for-each select="Root/Items/*">
<xsl:variable name="pos" select="position()" />
<tr>
<td>
<xsl:value-of select="local-name()" />
</td>
<td>
<xsl:value-of select="." />
</td>
<td>
<xsl:value-of select="../../Errors/*[$pos]" />
</td>
</tr>
</xsl:for-each>
答案 1 :(得分:0)
问题是,你有一个for-each与select =&#34; 1到3&#34;。因此,上下文节点是原子值。
其中一个选项是将根节点保存在变量中,并在for-each:
中使用它<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:variable name="Root" select="Root"/>
<table>
<thead>
<tr>
<th>Column A</th>
<th>Column B</th>
<th>Column C</th>
</tr>
</thead>
<tbody>
<xsl:for-each select="1 to 3">
<xsl:variable name="pos" select="position()" />
<tr>
<td>
<!-- <xsl:value-of select="Root/Items/local-name()" /> -->
</td>
<td>
<xsl:value-of select="$Root/Items/*[position() = $pos]" />
</td>
<td>
<xsl:value-of select="$Root/Errors/*[position()=$pos]" />
</td>
</tr>
</xsl:for-each>
</tbody>
</table>
</xsl:template>