xslt 2.0:current()无法按预期工作

时间:2016-01-12 14:55:16

标签: xml xslt

鉴于此输入:

<?xml version="1.0"?><catalog>
   <book>
      <autho>Gambardella, Matthew</author>
   </book>
   <book>
      <author>Ralls, Kim</author>
   </book>
   </catalog>

和这个XSLT 2.0样式表

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<out>
<xsl:apply-templates/>
</out>
</xsl:template>

<xsl:template match="catalog">

<xsl:for-each select="book">
<text>
Current node: <xsl:value-of select=" current()/name()"/>
Context node: <xsl:value-of select="./name()"/>
</text>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>

为什么输出

<?xml version="1.0" encoding="UTF-8"?><out><text>
Current node: catalog
Context node: book</text><text>
Current node: catalog
Context node: book</text></out>

但是:

<?xml version="1.0" encoding="UTF-8"?><out><text>
Current node: book
Context node: book</text><text>
Current node: book
Context node: book</text></out>

我认为current()引用了模板匹配的节点,我可以用它来始终引用回那个节点吗?

1 个答案:

答案 0 :(得分:2)

在处理带方括号的XPath表达式时,是否使用.current()确实有所不同。通过使用左方括号,您可以更改上下文,.将与括号前面的表达式相关联,而current()不受上下文更改的影响。

使用<xsl:for-each>,情况有所不同。它还会更改上下文,但.current()都会受到影响。

你想要的东西可以通过在for-each循环开始之前将.存储在变量中来实现:

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <out>
            <xsl:apply-templates/>
        </out>
    </xsl:template>
    <xsl:template match="catalog">
        <xsl:variable name="context" select="."/>
        <xsl:for-each select="book">
            <text>
Current node: <xsl:value-of select="$context/name()"/>
Context node: <xsl:value-of select="./name()"/>
            </text>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>