2016-07-14 1 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> 

Я пытаюсь выделить тех людей, где значение ключа выходит только один раз во всем документе. Я думаю, что решения связаны с generate-id (.), Но я не уверен. Как я могу использовать XSLT для вывода A00002 и A00003?

(XSLT 2.0)

ответ

1

Используйте ключ <xsl:key name="group" match="person/@key" use="."/>, а затем вычислить distinct-values(//person/@key)[not(key('group', .)[2])] только вам нужно хранить корень, как в

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

В качестве альтернативы вы могли бы, конечно, использовать <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>.