XPath获取所有属性过滤器仅返回单个实例的值

时间:2014-03-25 22:35:14

标签: xml xslt xpath xpath-1.0

假设我有以下xml结构,

<foos>
    <bar id="0001"></bar>
    <bar id="0002"></bar>
    <bar id="0003"></bar>
    <bar id="0004"></bar>
</foos>

为什么以下xpath只返回最后一个id?为什么不是所有id属性? XPath默认情况下会不同吗?

然后如果我用value-of更改copy-of,它会返回第一个id实例的值?这个排序是LIFO用于复制和FIFO的价值 -

<xsl:output method="xml"/>
<xsl:template match="/">
    <info>
        <xsl:copy-of select="//bar/@*"/>
    </info>
</xsl:template>

1 个答案:

答案 0 :(得分:1)

关于 copy-of 的答案大致是这样的:@id的第一个实例创建一个名为id的属性,其值为0001。第二个实例使用值0002覆盖此属性,依此类推。

如果,OTOH,您将此XML作为输入:

<foos>
    <bar id="0001"></bar>
    <bar ie="0002"></bar>
    <bar if="0003"></bar>
    <bar ig="0004"></bar>
</foos>

然后:

<info>
    <xsl:copy-of select="//bar/@*"/>
</info>

会回来的:

<info id="0001" ie="0002" if="0003" ig="0004"/>

因为现在@*的连续实例之间没有冲突。


关于的答案是在XSLT 1.0中:

<xsl:value-of select="$node-set"/>

将返回$ node-set中第一个节点的值。