【问题标题】:Compare attribute values using Xpath使用 Xpath 比较属性值
【发布时间】:2014-09-18 22:30:20
【问题描述】:

鉴于以下文档结构,我如何使用 Xpath 检查两个属性值是否匹配?

<document lang="en">
<element lang="en"></element>
<element lang="sv"></element>
<element lang="fr"></element>
</document>

我正在寻找的是这样的:

//document[@lang="[//element[@lang]"]

【问题讨论】:

    标签: xpath


    【解决方案1】:

    这将返回所有具有lang 属性值的&lt;document&gt; 节点匹配任何子节点&lt;element&gt;lang 属性:

    //document[@lang = element/@lang]
    

    【讨论】:

      【解决方案2】:

      具体到您的示例,您可以使用:

      //document[@lang=child::element/@lang]
      

      如果您只是检查是否存在匹配项,可以将其包装在 boolean 中:

      boolean(//document[@lang=child::element/@lang])
      

      如果要选择匹配的元素,可以通过ancestor查看:

      //element[@lang=ancestor::document[1]/@lang]
      

      如果你想匹配任何其他地方有匹配属性的节点,你可以这样做:

      //node()[@lang=following::node()/@lang]
      

      这应该匹配文档中其他地方匹配的第一个节点。

      【讨论】:

        【解决方案3】:

        这个例子应该可以工作:

        //document/@lang[. = //element/@lang]
        

        【讨论】:

          【解决方案4】:

          XPath 是一种查询语言。它的主要用途是查找 XML 节点,而不是“检查”某个条件是否为真。

          这样的任务更适合嵌入 XPath 的宿主语言,例如 XSLT。在 XSLT 中,为此有一个 xsl:if 元素。

          例如,写一个类似的模板

          <xsl:template match="/document">
            <xsl:if test="@lang = element/@lang">
              <true/>
            </xsl:if>
          </xsl:template>
          

          如果element 元素的属性值与document/@lang 的值相同,则上面的模板匹配document 并返回&lt;true/&gt; 元素。

          【讨论】:

          • 感谢您的回复,但很遗憾在这种情况下我无法使用 XSL/XSLT。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多