XSLT:在选择路径中使用position()

时间:2015-12-14 10:09:09

标签: xml xslt xslt-2.0

我试图使用位置来控制一个选择,但它似乎只在使用文字整数时起作用。我已经创建了一个非常简洁的示例,它跳过了很多其他背景,所以虽然看起来我没有效率地做到这一点,但它有很好的理由。

输入:

<container xmlns:xlink="http://www.w3.org/1999/xlink">
<item type="a" xlink:href="a1.xxx"/>
<item type="b" xlink:href="b1.jpg"/>
<item type="c" xlink:href="c1.jpg"/>
<item type="a" xlink:href="a2.xxx"/>
<item type="b" xlink:href="b2.jpg"/>
<item type="c" xlink:href="c2.jpg"/>
<assocData type="typeOne" xlink:href="objectOne"/>
<assocData type="typeTwo" xlink:href="objectThree"/>
<assocData type="typeOne" xlink:href="objectTwo"/>
<assocData type="typeTwo" xlink:href="objectFour"/>
</container>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="container">
        <xsl:for-each select="item[@type='b']">
            <container>
                <xsl:variable name="position">
                    <xsl:value-of select="position()"/>
                </xsl:variable>
                <xsl:copy-of select="../assocData[@type='typeOne'][$position]"/>
            </container>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

期望的输出:

<container>
<assocData type="typeOne" xlink:href="objectOne"/>
</container>
<container>
<assocData type="typeOne" xlink:href="objectTwo"/>
</container>

实际输出:

<container>
<assocData type="typeOne" xlink:href="objectOne"/>
<assocData type="typeOne" xlink:href="objectTwo"/>
</container>
<container>
<assocData type="typeOne" xlink:href="objectOne"/>
<assocData type="typeOne" xlink:href="objectTwo"/>
</container>

如果我更换&#39; $ position&#39;使用文字1或2,输出中的每个容器只包含一个assocData标记。我不确定为什么它对包含该位置的变量表现不同。

1 个答案:

答案 0 :(得分:1)

更改

 <xsl:variable name="position">
                    <xsl:value-of select="position()"/>
                </xsl:variable>

 <xsl:variable name="position" select="position()"/>

在这种情况下,变量的类型为整数,而在您的情况下,它是包含文本节点的结果树片段,该文本节点恰好是数值。