【问题标题】:<xsl:when test="//..."> syntax<xsl:when test="//..."> 语法
【发布时间】:2014-06-18 14:40:28
【问题描述】:

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

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

【问题讨论】:

    标签: xml xslt xpath


    【解决方案1】:

    // 在 XPath 中的准确定义是它的简写

    /descendant-or-self::node()/
    

    包括开头和结尾的斜杠。路径a//b 实际上是a/ba/*/ba/*/*/b 等的联合,可以重复任意次数的/*

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

    【讨论】:

      【解决方案2】:

      这实际上是一个 XPath 问题。

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

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

      //blam/hoot/kapow 匹配是否存在 blam 的节点模式,其中包含包含 kapow 的 hoot。

      第二个测试将匹配 blam/hoot/kapow 在这个:

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

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

      【讨论】:

        【解决方案3】:

        // 表示 XPath 中的 descendant::descendant-or-self:: 轴。它后面应该是一个节点测试,它可以是:

        • 元素的限定名称。例如://j:node_a(匹配前缀 j 表示的命名空间中的所有后代 node_a 元素 - 与 //descendant-or-self::j:node_a 相同)
        • * 代表 any 元素。例如://*(匹配所有后代元素 - 与//descendant-or-self::* 相同)
        • 文本(),处理指令()或评论()。例如: //text() (匹配所有后代 文本节点 - 与 //descendant-or-self::text() 相同)
        • 另一个轴。例如://@*(匹配所有属性 - 与 //attribute::* 相同)

        您可以在 XPath 表达式中的任何位置使用它来跳过树中的级别。例如:

        //j:Node_A//j:Node_c
        

        将匹配所有具有Node_A 祖先的Node_c 元素。

        请注意,XPath 表达式区分大小写:Node_a != Node_A != node_a

        您的 XSLT 选择带有前缀的元素。它还应该在某处(通常在 &lt;xsl:stylesheet&gt; 元素中)有一个声明,该声明将该前缀与命名空间相关联,以便您的表达式工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-27
          • 1970-01-01
          • 2012-04-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多