比较XPath

时间:2016-11-20 05:46:25

标签: xslt xpath

我想获取由其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属性与我当前匹配的connecteur标记的synonyme属性相匹配。但是没有找到该查询的结果,第二个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的预期输出为<corr>c160 foo</corr>

1 个答案:

答案 0 :(得分:2)

您使用的谓词:

[@id=@connecteur]

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

[@id=current()/@connecteur]

请参阅:https://www.w3.org/TR/xslt/#function-current

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

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

然后使用:

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

解决交叉引用。

请参阅:https://www.w3.org/TR/xslt/#key