2017-03-01 75 views
1

這不是完全刪除我在此論壇中找到的重複項的主題。XSLT - 從映射結果中刪除重複項

我有一個鍵/值映射,我想從映射的最終結果中刪除重複項。

源文檔:

<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」,它可以刪除。但我想刪除結果重複的值不重複的鍵。

簡單映射的東西只是爲了顯示工作代碼。

回答

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> 
+0

什麼是使用密鑰(),使得它更好的效益? – LadyCygnus

+2

給定''處理器通過MapCode屬性值對'topic'元素進行索引,然後通過重複訪問找到匹配直接使用索引而不是搜索所有元素。 –