2016-11-20 85 views
1

我想获取由其id属性指定的特定节点的值。但是,我的XSL解析器Saxon的行为并不是我期望它的工作方式。比较XPath中的属性值

这是我的XSL代码:

<xsl:template match="synonyme"> 
    <xsl:element name="corr"> 
     <xsl:value-of select="@connecteur" /> 
     <xsl:value-of select="/liste/connecteur[@[email protected]]/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的预期输出为<corr>c160 foo</corr>

回答

1

谓语使用:

[@[email protected]] 

正在寻找一个元素有两个属性 - 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