for索引xsl的循环

时间:2014-04-15 14:42:31

标签: xml xslt xslt-2.0

我正在尝试根据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>

2 个答案:

答案 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>