鉴于此输入:
<?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()
引用了模板匹配的节点,我可以用它来始终引用回那个节点吗?
答案 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>