我有一个大型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)
答案 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>
。