首页 > 解决方案 > XSLT - 在复制所有其他元素时向元素添加序列号/计数器

问题描述

亲爱的,我在 xml 下面有一个 edi xml,里面有 2 个文档。我想为 M_810 下的每个 ST 和 SE 分配一个序列号我有 2 个 M_810 用于我的第一个 M_810 - ST-D_329 和 SE-D-329 - 我想有序列号 2001 第二个 M_810 - ST-D_329 和 SE- D_329 - 我想要序列号 2002

我试过下面的代码。它总是在需要的地方给我 2001。寻求一些帮助来解决这个问题。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>    
<xsl:template match="@*|node()">
<xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="D_329">
<xsl:if test="((../name() = 'S_ST') or (../name() = 'S_SE'))">
<D_329><xsl:value-of select="2000 + ../position()"/></D_329>    
</xsl:if>    
</xsl:template>
</xsl:stylesheet>

源代码:

        <?xml version='1.0' encoding='UTF-8'?><Interchange>
        <M_810>
                <S_ST>
                    <D_143>810</D_143>
                    <D_329>47857</D_329>
                </S_ST>
                <S_BIG>
                    <D_373>20210128</D_373>
                    <D_76>917183</D_76>
                    <D_373_2>20210120</D_373_2>
                    <D_324>13453796</D_324>
                </S_BIG>
                <S_SE>
                    <D_96>21</D_96>
                    <D_329>47857</D_329>
                </S_SE>
            </M_810>                
            <M_810>
                <S_ST>
                    <D_143>810</D_143>
                    <D_329>47858</D_329>
                </S_ST>
                <S_BIG>
                    <D_373>20210128</D_373>
                    <D_76>917184</D_76>
                    <D_373_2>20210120</D_373_2>
                    <D_324>13453797</D_324>
                </S_BIG>
                <S_SE>
                    <D_96>21</D_96>
                    <D_329>47858</D_329>
                </S_SE>
            </M_810>
        </Interchange>

所需输出:

        <?xml version="1.0" encoding="UTF-8"?><Interchange>
        <M_810>
                <S_ST>
                    <D_143>810</D_143>
                    <D_329>2001</D_329>
                </S_ST>
                <S_BIG>
                    <D_373>20210128</D_373>
                    <D_76>917183</D_76>
                    <D_373_2>20210120</D_373_2>
                    <D_324>13453796</D_324>
                </S_BIG>
                <S_SE>
                    <D_96>21</D_96>
                    <D_329>2001</D_329>
                </S_SE>
            </M_810>                
            <M_810>
                <S_ST>
                    <D_143>810</D_143>
                    <D_329>2002</D_329>
                </S_ST>
                <S_BIG>
                    <D_373>20210128</D_373>
                    <D_76>917184</D_76>
                    <D_373_2>20210120</D_373_2>
                    <D_324>13453797</D_324>
                </S_BIG>
                <S_SE>
                    <D_96>21</D_96>
                    <D_329>2002</D_329>
                </S_SE>
            </M_810>
         </Interchange>

父节点中每次出现都要修改的 xml 节点:

  <S_ST>
    <D_143>810</D_143> 
    <D_329>47857</D_329> >> <D_329>2001</D_329>
</S_ST>
and 
    <S_SE>
      <D_96>21</D_96>
      <D_329>47857</D_329> >> <D_329>2001</D_329>
    </S_SE>

标签: xslt-2.0edixslt-3.0

解决方案


假设 XSLT 3,听起来好像你想要

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="M_810/S_ST/D_329">
      <xsl:copy>
          <xsl:number count="M_810/S_ST/D_329" start-at="2001" level="any"/>
      </xsl:copy>
  </xsl:template>
  
  <xsl:template match="M_810/S_SE/D_329">
      <xsl:copy>
          <xsl:number count="M_810/S_SE/D_329" start-at="2001" level="any"/>
      </xsl:copy>
  </xsl:template>
  
</xsl:stylesheet>

我还不能检查正确的输出,检查自己,或者如果它不起作用,请考虑从样本中删除不相关的元素,以简化我们查看要转换和编号的元素的任务。


推荐阅读