【问题标题】:Comparing attribute values in XPath比较 XPath 中的属性值
【发布时间】:2016-11-20 05:46:25
【问题描述】:

我想获取由其id 属性指定的特定节点的值。但是我的 XSL 解析器 Saxon 的行为并不是我预期的那样工作。

这是我的 XSL 代码:

<xsl:template match="synonyme">
    <xsl:element name="corr">
        <xsl:value-of select="@connecteur" />
        <xsl:value-of select="/liste/connecteur[@id=@connecteur]/forme[1]" />
    </xsl:element>
</xsl:template>

我刚刚匹配了一个名为synonyme 的标签,它有一个connecteur 属性。我的代码输出了这个属性的值。

我还想输出另一个节点的值,该节点的 id 属性与我当前匹配的 synonyme 标记的 connecteur 属性匹配。但是这个查询没有找到任何结果,第二个value-of 总是有空输出。

如果我写,例如[@id='c160'],其中c160 与第一个value-of 输出的内容完全相同,它可以工作!但与我的匹配节点的@attribute 相比时不是这样。我该如何解决这个问题?

XML 基本上是

<liste><connecteur id="c160"><forme>foo</forme></connecteur>
       <connecteur id="c161"><synonyme connecteur="c160" /></connecteur>
</liste>

代替synonyme 的预期输出是&lt;corr&gt;c160 foo&lt;/corr&gt;

【问题讨论】:

    标签: xslt xpath


    【解决方案1】:

    你使用的谓词:

    [@id=@connecteur]
    

    正在寻找具有两个属性的元素 - idconnecteur- 具有相等的值。要查找具有id 属性且其值与当前元素的connecteur 值匹配的元素,您需要使用:

    [@id=current()/@connecteur]
    

    见:https://www.w3.org/TR/xslt/#function-current


    更好的解决方案是将 key 定义为:

    <xsl:key name="ref" match="connecteur" use="@id" />
    

    然后使用:

    <xsl:value-of select="key('ref', @connecteur)/forme" />
    

    解决交叉引用。

    见:https://www.w3.org/TR/xslt/#key

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      相关资源
      最近更新 更多