我想获取由其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>
。
答案 0 :(得分:2)
您使用的谓词:
[@id=@connecteur]
正在寻找具有两个属性的元素 - id
和connecteur
- 具有相同的值。要查找具有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" />
解决交叉引用。