在包含节点集的变量上使用Key(用于分组)

时间:2011-08-19 10:22:42

标签: xml xslt xpath

这是我的xml的缩减示例

<Albums>
    <Album id="1">
        <info>sdkjsdaln</info>
    </Album>
    <Album id="2">
        <info>asdlnasd</info>
    </Album>
    <Album id="3">
        <info>sadsasd</info>
    </Album>
</Albums>

我使用扩展功能来获取更多数据

<xsl:template match="Album">
     <xsl:variable name="Album" select="mfeg:GetAlbumMetadata(@id)"/>
</xsl:template>

然后我有变量$ Album,我引用它来获取所有额外数据,如下所示

<Album>
    <Tracks>
        <Track>
        <Contributors>
            <Contributor>Tim</Contributor>
            <Contributor>Alfie</Contributor>
        </Contributors>
        </Track>
        <Track>
        <Contributors>
            <Contributor>Tim</Contributor>
            <Contributor>Alfie</Contributor>
        </Contributors>
        </Track>
        <Track>
        <Contributors>
            <Contributor>Kevin</Contributor>
            <Contributor>Sam</Contributor>
        </Contributors>
        </Track>
    </Tracks>
</Album>

我正在尝试获得独特的贡献者,我不知道如何/如果可以在我的变量$ Album上使用Key来获取我需要的数据。我已尝试过下面的xpath,但它不起作用。

$Album/Tracks/Track/Contributors/Contributor[not(.=preceding-sibling::Name)]

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

定义一个你只需使用的密钥即可。

<xsl:key name="k1" match="Track/Contributors/Contributor" use="."/>

然后应用Muenchian分组你应该能够

<xsl:apply-templates select="$Album/Tracks/Track/Contributors/Contributor[generate-id() = generate-id(key('k1', .)[1])]"/>

然后您可以为Contributor元素编写模板。请注意,您可能需要调整路径以适应$Album/Album/Tracks/Track/Contributors/Contributor[generate-id() = generate-id(key('k1', .)[1])],取决于扩展函数返回的节点(元素或文档节点)类型。