XSLT - 在谓词过滤器中,为什么必须有时使用XSLT current()函数而不是XPath上下文节点点运算符?

时间:2014-03-27 20:10:37

标签: xslt xpath xmlnode

在谓词过滤器中,我试图弄清楚如何最好地解释为什么以及何时必须使用XSLT current()函数而不是XPath上下文节点.表达式。

在w3schools XSLT current() Function页面上给出的示例仅有一点帮助,因为它似乎主要说明差异而没有真正解释它。 Michael Kay在“XSLT 2.0和XPath 2.0第4版”第13章中对current()函数的讨论以及Paul Jungwirth对问题Current node vs. Context node in XSLT/XPath?的回答都有助于我理解个人差异;但每个人都让我苦苦思索如何解释与他人的差异,而不仅仅是使用图表和代码来说明差异。

如果有人会分享他们如何进一步解释这一点,我将非常感激。

3 个答案:

答案 0 :(得分:3)

在XPath中,位置路径表达式相对于上下文节点,例如:

head/title

@class

Predicates 用于过滤序列(v1中的节点集)。使用项目作为上下文,针对序列中的每个项目(或节点)评估谓词表达式。 e.g。

div[@class] (: @class is relative to div :)

current()函数在XSLT(不是XPath)中可用,以引用包含xsl:templatexsl:for-each指令当前正在处理的节点。

http://www.w3.org/TR/xslt#function-current

答案 1 :(得分:0)

我知道这个代码 源:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<parent>
    <variable>A</variable>
    <child>
        <variable>B</variable>
    </child>
</parent>

XSLT:

   <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:template match="/parent">

            <xsl:value-of select="string('using current')"/>
            <xsl:choose>
                <xsl:when test="child[current()/variable = 'A']">
                    <xsl:text>&#10;child[current()/variable = 'A']// -> is true</xsl:text> 
                </xsl:when>
                <xsl:otherwise>
                    <xsl:text>&#10;child[current()/variable = 'A']// -> is false</xsl:text> 
                </xsl:otherwise>
            </xsl:choose>

            <xsl:value-of select="string('&#10;&#10;using dot')"/>
            <xsl:choose>
                <xsl:when test="child[./variable = 'A']">
                    <xsl:text>&#10;child[./variable = 'A']// -> is true</xsl:text> 
                </xsl:when>
                <xsl:otherwise>
                    <xsl:text>&#10;child[./variable = 'A']// -> is false</xsl:text> 
                </xsl:otherwise>
            </xsl:choose>

            <xsl:value-of select="string('&#10;&#10;using dot')"/>
            <xsl:choose>
                <xsl:when test="child[./variable = 'B']">
                    <xsl:text>&#10;child[./variable = 'B']// -> is true</xsl:text> 
                </xsl:when>
                <xsl:otherwise>
                    <xsl:text>&#10;child[./variable = 'B']// -> is false</xsl:text> 
                </xsl:otherwise>
            </xsl:choose>


    </xsl:template>
</xsl:stylesheet>

输出:

using current
child[current()/variable = 'A']// -> is true

using dot
child[./variable = 'A']// -> is false

using dot
child[./variable = 'B']// -> is true

所以,您可以使用当前节点内的“当前”功能检查,而不是在子项内部,例如使用点。

答案 2 :(得分:0)

上下文节点随着您添加到路径表达式的任何步骤和任何谓词而更改,而当前节点仅由诸如apply-templates和for-each之类的XSLT指令更改。