这来自每一个
<PERM>
<ROLE>
并计算其独特的前辈:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output method="text" />
<xsl:variable name="TAB" select="'	'" />
<xsl:variable name="LF" select="'
'" />
<xsl:key name="kRole" match="ROLE" use="@name" />
<xsl:template match="/">
<xsl:apply-templates select="//PERM" />
</xsl:template>
<xsl:template match="PERM">
<xsl:variable name="vThisRole" select="ancestor::ROLE[1]" />
<xsl:variable name="vPrecedingRoles" select="
($vThisRole | $vThisRole/preceding-sibling::ROLE)
" />
<xsl:variable name="vUniquePrecedingRoles" select="
$vPrecedingRoles[count(. | key('kRole', ./@name)[1]) = 1]
" />
<xsl:value-of select="
concat(
$vThisRole/@name, $TAB,
@permfrom, $TAB,
count($vUniquePrecedingRoles), $LF
)
" />
</xsl:template>
</xsl:stylesheet>
TESTER PERM1565 1
PARENT1 PERM1 2
PARENT1 PERM2 2
PARENT1 PERM54 2
PARENT2 PERM1 3
PARENT2 PERM2 3
PARENT3 PERM44 4
如果你问我,你正在处理的XML的状态非常糟糕。至少,任何与安全相关的东西都是通过“前面唯一名称的计数”而不是适当的数据结构来表达的,这让我挠头。;-)你能改变一下输入吗?