您的 XSLT 中有一个模板忽略PartPosition
<xsl:template match="DamagePosition|DamageCode|PartPosition"/>
因此,当你这样做时<xsl:apply-templates/>
在你的copy
模板,因为您位于DamagePosition
此时,上面的模板将匹配子项PartPosition
并忽略它。
也许你应该忽略DamageSeqNumber
代替PartPosition
在此刻?
另外,您可能并不真正需要copy
根本没有模板。相反,更改对它的调用,以简单地获取键的所有子元素,然后让身份模板处理它。
<xsl:apply-templates select="key('kuserID',DamageCode)/*" />
试试这个 XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kuserID" match="DamagePosition" use="DamageCode"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*">
<xsl:sort select="DamageCode" data-type="number"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="DamagePosition|DamageCode|DamageSeqNumber"/>
<xsl:template match="DamagePosition[generate-id() = generate-id(key('kuserID', DamageCode)[1])]">
<DamagePosition>
<xsl:copy-of select="DamageCode"/>
<xsl:copy-of select="DamageSeqNumber"/>
<xsl:apply-templates select="key('kuserID',DamageCode)/*" />
</DamagePosition>
</xsl:template>
</xsl:stylesheet>
这并不能完全给出您在问题中显示的输出,因为您显示了两个OperationPosition
输出中包含元素,尽管输入中只有一个元素。
编辑:如果你想要OperationPosition
之前的元素PartPosition
元素,您可以替换现有的<xsl:apply-templates select="key('kuserID',DamageCode)/*" />
用这两行代替:
<xsl:apply-templates select="key('kuserID',DamageCode)/OperationPosition" />
<xsl:apply-templates select="key('kuserID',DamageCode)/*[not(self::OperationPosition)]" />