获取XML中引用元素属性的元素的位置

时间:2016-02-23 15:14:35

标签: xml xslt

我有这个XML。

<root>
    <item id="first"></item>
    <item id="second"></item>
    <item id="third"></item>

    <ref ids="first"></ref>
    <ref ids="first second"></ref>
    <ref ids="third"></ref>
</root>

我想找到引用<ref>的{​​{1}}元素的位置。 对于上面的XML,它应该是这样的。

<item>

我试图为此编写XSLT,但我遇到了一些问题。

1,2
2
3
  1. 如果某个id是其他id的子字符串,则contains()匹配它 - How 我可以避免吗?
  2. position()始终从1开始,但我希望在XML中使用<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="utf-8" indent="no"/> <xsl:template match="item"> <xsl:variable name="thisId" select="@id" /> <xsl:variable name="references" select="/root/ref[contains(@ids, $thisId)]/position()" /> <xsl:value-of select="$references" separator=", " /> </xsl:template> </xsl:stylesheet> 的真实位置。
  3. 您对如何确保这一点有什么想法吗?谢谢。

1 个答案:

答案 0 :(得分:1)

假设您使用的是 XSLT 2.0 ,请尝试:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>

<xsl:key name="ref" match="ref" use="tokenize(@ids, ' ')" />

<xsl:template match="item">
    <xsl:value-of select="key('ref', @id)/(count(preceding-sibling::ref) + 1)" separator=", " />
    <xsl:text>&#10;</xsl:text>
</xsl:template>

</xsl:stylesheet>