使用<xsl:key>标识特定类型的所有节点的唯一值</xsl:key>

时间:2014-09-17 13:05:40

标签: xml xslt

我正在使用<xsl:key>来识别一组节点中的唯一值。但是,我的一些节点是嵌套的,而我当前的实现并未获取这些值。

假设我有以下XML结构:

<Concepts>
<Concept>
    <Type>A</Type>
</Concept>

<Concept>
    <Type>B</Type>
</Concept>

<Concept>
    <OR>
        <Type>C</Type>
    </OR>
    <OR>
        <Type>D</Type>
    </OR>
</Concept>
</Concepts>

我目前正在使用以下XSLT1.0代码:

<xsl:key name="types" match="Concepts/Concept" use="Type"/>
<xsl:template match="/">
    <ul>
        <xsl:for-each select="//Concept[generate-id() = generate-id(key('types',Type)[1])]">
            <li><xsl:value-of select="Type"/></li>
        </xsl:for-each>
    </ul>
</xsl:template>

结果是:

  • A

但是,我希望结果是:

  • A
  • C
  • d

有没有简单的解决方案,还是我必须重构我的XML?

1 个答案:

答案 0 :(得分:2)

尝试将密钥更改为:

<xsl:key name="types" match="Type" use="."/>

然后你的xsl:for-each到此......

<xsl:for-each select="//Type[generate-id() = generate-id(key('types',. )[1])]">

这应该给你不同的类型。您还必须将<xsl:value-of select="Type"/>更改为xsl:value-of select="."/>

注意,如果您的XML中有其他Type元素,但您只想要Concept元素中的元素,那么您也可以这样做....

<xsl:key name="types" match="Type[ancestor::Concept]" use="."/>