如何使用XSLT在XML中创建增量序列号

时间:2018-08-06 15:15:49

标签: xml xslt xpath xpath-2.0

我需要生成一个递增的序列号,如下所示。如果您可以在下面看到序列号属性,则它的顺序不正确,在某些地方它出现在后代节点中,而在某些地方则以不同的顺序出现。是否有任何通用代码生成此序列号。

当前,我尝试使用以下方式,但这些方式无效。任何帮助将不胜感激。

  1. xsl:value-of select =“ preceding-sibling :: @ [SeqNum] / @ n”
  2. SeqNum =“ {格式编号(count(preceding @ SeqNum)+ 1,'0000')}”

示例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>

1 个答案:

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