我正在尝试调试现有的XSLT文件并具有以下元素
<xsl:choose>
<xsl:when test="//j:Node_A/j:Node_B/j:Node_c">
<xsl:apply-templates select="//j:Node_A/j:Node_B/j:Node_c />
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="NoMatch" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
据我理解测试语句,它正在寻找XML中的以下结构,并且当找到结构时应用模板。
<node_a>
<node_b>
<node_c>
DATA
</node_c>
</node_b>
</node_a>
我不明白的是//
的含义。
答案 0 :(得分:2)
XPath中//
的精确定义是它是
/descendant-or-self::node()/
包括前导和尾部斜杠。路径a//b
实际上是a/b
,a/*/b
,a/*/*/b
等的联合,用于/*
在实践中,这意味着当您想要在任何级别寻找后代节点而不仅仅是直接的子节点时,您可以使用它,例如/node_a//node_c
。
答案 1 :(得分:1)
这实际上是一个XPath问题。
“//”表示“不是从根开始”
/blam/hoot/kapow
仅在根节点为blam时匹配。
//blam/hoot/kapow
匹配。
第二次测试将匹配blam / hoot / kapow:
<schmar>
<blam>
<hoot>
<kapow>
</kapow>
</hoot>
</blam>
</schmar>
第一个测试在上面的xml中不匹配。
答案 2 :(得分:1)
//
代表XPath中的descendant::
或descendant-or-self::
轴。接下来应该是节点测试,它可以是:
node_a
表示的命名空间中的所有后代j
元素 - 与//descendant-or-self::j:node_a
相同)*
代表任何元素。例如:* *(匹配所有后代元素 - 与//descendant-or-self::*
相同)//descendant-or-self::text()
相同)//@*
(匹配所有属性 - 与//attribute::*
相同)您可以在XPath表达式中的任何位置使用它来跳过树中的级别。例如:
//j:Node_A//j:Node_c
将匹配具有Node_c
祖先的所有Node_A
元素。
请注意,XPath表达式区分大小写:Node_a
!= Node_A
!= node_a
。
您的XSLT选择带前缀的元素。它还应该在某个地方(通常在<xsl:stylesheet>
元素中)有一个声明,它将该前缀与命名空间相关联,以使表达式起作用。