XSLT - 从映射结果中删除重复项

时间:2017-03-01 16:05:16

标签: xslt xslt-2.0

这不是删除我在此论坛上发现的重复项的主题。

我有一个键/值映射,我想从映射的最终结果中删除重复项。

来源文件:

<article>
    <subject code="T020-060"/>
    <subject code="T020-010"/>
    <subject code="T090"/>
</article>

映射:

<xsl:variable name="topicalMap">
    <topic MapCode="T020-060">Value 1</topic>
    <topic MapCode="T020-010">Value 1</topic>
    <topic MapCode="T090">Value 3</topic>
</xsl:variable>

期望的结果:

<article>
    <topic>Value 1</topic>
    <topic>Value 3</topic>
</article>

XSLT我正在使用(注意,它有一个测试标签和代码,以确保映射有效):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

<xsl:output method="xml" encoding="utf8" indent="yes" exclude-result-prefixes="#all"/>

<xsl:template match="article">
    <article>
        <xsl:for-each-group select="subject" group-by="$topicalMap/topic[@MapCode = @code]">
            <test-group>
                <code>Current code: <xsl:value-of select="@code"/></code>
                <topic>Current keyword: <xsl:value-of
                        select="$topicalMap/topic[@MapCode = @code]"/></topic>
            </test-group>
        </xsl:for-each-group>
        <simple-mapping><xsl:apply-templates/></simple-mapping>
    </article>
</xsl:template>


<!-- Simple Mapping Topics -->
<xsl:template match="subject">
    <xsl:variable name="ArticleCode" select="@code"/>
    <topic>
        <xsl:value-of select="$topicalMap/topic[@MapCode = $ArticleCode]"/>
    </topic>
</xsl:template>

<!-- Keyword Map -->
<xsl:variable name="topicalMap">
    <topic MapCode="T020-060">Value 1</topic>
    <topic MapCode="T020-010">Value 1</topic>
    <topic MapCode="T090">Value 3</topic>
</xsl:variable>

</xsl:stylesheet>

以这种方式进行分组不会产生任何结果。如果我复制源文档中的主题,并执行group-by =“@ code”,在应用映射之前将其删除。但我想删除结果重复值而不是重复键。

简单映射的东西就是显示工作代码。

1 个答案:

答案 0 :(得分:2)

使用

    <xsl:for-each-group select="subject" group-by="$topicalMap/topic[@MapCode = current()/@code]">
        <topic>
            <xsl:value-of select="current-grouping-key()"/>
        </topic>
    </xsl:for-each-group>

或更好

<xsl:key name="map" match="topic" use="@MapCode"/>


<xsl:template match="article">
    <article>
        <xsl:for-each-group select="subject" group-by="key('map', @code, $topicalMap)">
            <topic>
                <xsl:value-of select="current-grouping-key()"/>
            </topic>
        </xsl:for-each-group>
    </article>
</xsl:template>