如果属性值是单数,则执行某些操作

时间:2016-07-14 13:14:24

标签: xml xslt attributes

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

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