我需要生成一个递增的序列号,如下所示。如果您可以在下面看到序列号属性,则它的顺序不正确,在某些地方它出现在后代节点中,而在某些地方则以不同的顺序出现。是否有任何通用代码生成此序列号。
当前,我尝试使用以下方式,但这些方式无效。任何帮助将不胜感激。
示例XML:
<act>
<ActAssociation ***SeqNum="1"***>
<InitialRptIndicator>Y</InitialRptIndicator>
</ActAssociation>
<Party ***SeqNum="2"***>
<ActPartyTypeCode>35</ActPartyTypeCode>
<PartyName ***SeqNum="3"***>
<PartyNameTypeCode>L</PartyNameTypeCode>
</PartyName>
</Party>
<Party SeqNum="4">
<PartyName SeqNum="5">
<fc2:PartyNameTypeCode>L</fc2:PartyNameTypeCode>
</PartyName>
</act>
答案 0 :(得分:2)
如果您通过对属性进行硬编码来添加属性,那么我认为XSLT 2和更高版本中最简单的解决方案是在变量中进行操作,以使您拥有临时树,然后通过使用{{ 1}}:
<xsl:number count="*[@SeqNum]" level="any"/>
请参见https://xsltfiddle.liberty-development.net/eiZQaFu/2,它是XSLT 3,但对于XSLT 2,您只需将identity transformation template替换为<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="doc1">
<root>
<foo SeqNum=""/>
<bar>
<foobar SeqNum=""/>
</bar>
<baz SeqNum="">
<whatever/>
</baz>
</root>
</xsl:variable>
<xsl:template match="/">
<xsl:apply-templates select="$doc1/node()"/>
</xsl:template>
<xsl:template match="*/@SeqNum">
<xsl:attribute name="{name()}">
<xsl:number count="*[@SeqNum]" level="any"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
。