<xsl:when test =“// ...”> syntax </xsl:when>

时间:2014-06-18 14:40:28

标签: xml xslt xpath

我正在尝试调试现有的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>

我不明白的是//的含义。

3 个答案:

答案 0 :(得分:2)

XPath中//的精确定义是它是

的简写
/descendant-or-self::node()/

包括前导和尾部斜杠。路径a//b实际上是a/ba/*/ba/*/*/b等的联合,用于/*

的任意数量的重复

在实践中,这意味着当您想要在任何级别寻找后代节点而不仅仅是直接的子节点时,您可以使用它,例如/node_a//node_c

答案 1 :(得分:1)

这实际上是一个XPath问题。

“//”表示“不是从根开始”

/blam/hoot/kapow仅在根节点为blam时匹配。

如果存在包含包含kapow的hoot的blam节点模式,则

//blam/hoot/kapow匹配。

第二次测试将匹配blam / hoot / kapow:

<schmar>
   <blam>
     <hoot>
       <kapow>
       </kapow>
     </hoot>
   </blam>
</schmar>

第一个测试在上面的xml中不匹配。

答案 2 :(得分:1)

//代表XPath中的descendant::descendant-or-self::轴。接下来应该是节点测试,它可以是:

  • 元素的限定名称。例如:// j:node_a(匹配由prexif node_a表示的命名空间中的所有后代j元素 - 与//descendant-or-self::j:node_a相同)
  • *代表任何元素。例如:* *(匹配所有后代元素 - 与//descendant-or-self::*相同)
  • text(),processing-instruction()或comment()。例如:// text()(匹配所有后代文本节点 - 与//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>元素中)有一个声明,它将该前缀与命名空间相关联,以使表达式起作用。