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

我试图找出那些在整个文档中只有一次value-key出现的人。我猜这个解决方案与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>的替代品。

相关问题