在谓词过滤器中,我试图弄清楚如何最好地解释为什么以及何时必须使用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?的回答都有助于我理解个人差异;但每个人都让我苦苦思索如何解释与他人的差异,而不仅仅是使用图表和代码来说明差异。
如果有人会分享他们如何进一步解释这一点,我将非常感激。
答案 0 :(得分:3)
在XPath中,位置路径表达式相对于上下文节点,例如:
head/title
或
@class
Predicates 用于过滤序列(v1中的节点集)。使用项目作为上下文,针对序列中的每个项目(或节点)评估谓词表达式。 e.g。
div[@class] (: @class is relative to div :)
current()
函数在XSLT(不是XPath)中可用,以引用包含xsl:template
或xsl:for-each
指令当前正在处理的节点。
答案 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> child[current()/variable = 'A']// -> is true</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text> child[current()/variable = 'A']// -> is false</xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="string(' using dot')"/>
<xsl:choose>
<xsl:when test="child[./variable = 'A']">
<xsl:text> child[./variable = 'A']// -> is true</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text> child[./variable = 'A']// -> is false</xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="string(' using dot')"/>
<xsl:choose>
<xsl:when test="child[./variable = 'B']">
<xsl:text> child[./variable = 'B']// -> is true</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text> 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指令更改。