2016-07-14 8 views
0

私は人が識別価値を持っている大きなXMLファイルを持っています。簡略化されたバージョンは次のようになります。属性値が単数形の場合は何かを実行します

<start> 
<text 1> 
    <person key="A00001">Adam Ant</person> 
    <person key="A00001">Mr. A.</person> 
</text 1> 
<text 2> 
    <poem> 
    <person key="A00002">Mrs. Bee</person> 
    <person key="A00003">Cecily</person> 
    <person key="A00001">A.</person> 
    </poem> 
</text 2> 
</start> 

バリューキーが文書全体で1回だけ出てくる人を選んでみます。私は解決策は、生成ID(。)と関係していると思うが、わからない。 XSLTを使用してA00002とA00003を出力するにはどうすればよいですか?

(XSLT 2.0)

答えて

1

はキー<xsl:key name="group" match="person/@key" use="."/>を使用して、あなたはもちろん<xsl:for-each-group select="//person/@key" group-by="."><xsl:if test="not(current-group()[2])"><xsl:value-of select="."/></xsl:if></xsl:for-each>を使用することができます別の方法として

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0"> 

    <xsl:key name="group" match="person/@key" use="."/> 

    <xsl:variable name="root" select="/"/> 

    <xsl:template match="/"> 
     <xsl:value-of select="distinct-values(//person/@key)[not(key('group', ., $root)[2])]"/> 
    </xsl:template> 
</xsl:stylesheet> 

のように、ルートを保存する必要がある唯一のdistinct-values(//person/@key)[not(key('group', .)[2])]を計算します。

関連する問題