【问题标题】:XSLT - Adding a sequence number/counter to an element while copying all other elementsXSLT - 在复制所有其他元素时向元素添加序列号/计数器
【发布时间】:2021-02-12 05:21:31
【问题描述】:

亲爱的, 我在 xml 下面有一个 edi xml,里面有 2 个文档。我想为 M_810 下的每个 ST 和 SE 分配一个序列号 我的第一个 M_810 有 2 个 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>

src xml:

        <?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.0 edi xslt-3.0


    【解决方案1】:

    假设 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>
    

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

    【讨论】:

    • 感谢 Martin 的快速帮助。这个对我有用 。预期的输出是匹配的。我已经更新了 xml 示例以方便其他人使用。实际上我想给出问题的完整背景。
    • 能否请您帮我计算 M_810 下的段数并在 M_810 下的所有段计数 谢谢
    • 嗨马丁,下面给了我预期的结果。
    • @SreenivasReddy,考虑在单独的新问题中提出新问题,而不是在评论中。我不太明白你认为段的数量是多少,但如果解决方案&lt;xsl:value-of select="count(../preceding-sibling::*) + 1"/&gt; 对你有用,那么它肯定是一种计算节点的方法。本着前面带有专用xsl:number 指令的示例的精神,也可以使用&lt;xsl:template match="M_810/S_SE/D_96"&gt;&lt;xsl:copy&gt;&lt;xsl:number count="M_810/*"/&gt;&lt;/xsl:copy&gt;&lt;/xsl:template&gt;
    • 谢谢马丁,我肯定会发布一个新问题。非常感谢您的再次帮助。干杯。
    猜你喜欢
    • 2018-03-18
    • 1970-01-01
    • 2012-09-17
    • 2018-09-28
    • 2011-03-24
    • 2017-08-07
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    相关资源
    最近更新 更多