这个 XSLT 1.0 转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my">
<xsl:output method="text"/>
<my:commonAbsent/>
<xsl:variable name="vVer" select=
"/*/node
[starts-with(., 'e')
and
number(substring(.,2)) = number(substring(.,2))]"/>
<xsl:template match="/*">
<xsl:apply-templates mode="unique" select=
"node[not(. = 'abc'
or
generate-id() =generate-id($vVer)
)
]"/>
<xsl:apply-templates select="$vVer" mode="ver"/>
<xsl:apply-templates select=
"node[. = 'abc']
|
document('')
[not(current()/node[.='abc'])]
/*/my:commonAbsent
"/>
</xsl:template>
<xsl:template match="node" mode="unique">
Unique name with version from the xml - <xsl:text/>
<xsl:value-of select="concat(., $vVer)"/>
</xsl:template>
<xsl:template match="node" mode="ver">
Version number - <xsl:value-of select="$vVer"/>
</xsl:template>
<xsl:template match="node[. = 'abc']">
Common name - Present in the input
</xsl:template>
<xsl:template match="my:commonAbsent">
Common name - Absent in the input
</xsl:template>
</xsl:stylesheet>
应用于提供的 XML 文档时:
<Root>
<node>abc</node>
<node>e1</node>
<node>uniquename2</node>
</Root>
产生想要的正确结果:
Unique name with version from the xml - uniquename2e1
Version number - e1
Common name - Present in the input
当对没有“通用名称”的 XML 文档应用相同的转换时:
<Root>
<node>e1</node>
<node>uniquename2</node>
</Root>
再次产生正确的、想要的结果:
Unique name with version from the xml - uniquename2e1
Version number - e1
Common name - Absent in the input
最后,如果 XML 文档中没有表示“版本”:
<Root>
<node>abc</node>
<node>uniquename2</node>
</Root>
再次应用相同的转换会产生想要的正确结果:
Unique name with version from the xml - uniquename2
Common name - Present in the input
说明:
结果树中节点的顺序(在这些情况下,它们都是文本节点)完全由指令的顺序决定,这些xsl:apply-templates
指令选择执行生成这些结果树节点的模板。