如何在xslt中基于段标记中的值重申XML?骡子?

如何在xslt中基于段标记中的值重申XML?骡子?,xml,xslt,mule,Xml,Xslt,Mule,我试图重申一个基于xml值中quantity标记内的值的段。这将再次用于增加另一个标记的值 输入 啊 液 9abb2454-068d-11e6-8f1b-509e20524153 2016-04-19T12:30:16.52+10:00 对 2016-04-19T12:30:16.52+10:00 0030-0080 ACTSTRBNE 7CAGL3G01 700032961 - 700033060 #4 100 对于这种情况,我需要将库存移动数据重复100次,并增加串行标记 目标 &l

我试图重申一个基于xml值中quantity标记内的值的段。这将再次用于增加另一个标记的值

输入


啊
液
9abb2454-068d-11e6-8f1b-509e20524153
2016-04-19T12:30:16.52+10:00
对
2016-04-19T12:30:16.52+10:00
0030-0080
ACTSTRBNE
7CAGL3G01
700032961 -   700033060 #4
100
对于这种情况,我需要将库存移动数据重复100次,并增加串行标记

目标

<?xml version="1.0" encoding="UTF-8"?>
<StockMovementDataRequest xmlns:a="http://www.edi.com.au/EnterpriseService/" xmlns:p1="urn:ams.com.au:dynamo:3pl:am:SAP_AM_I_005:StockMovement">
   <Header>
      <From>AWH</From>
      <To>SAP</To>
      <Unique_ID>9abb2454-068d-11e6-8f1b-509e20524153</Unique_ID>
      <DateTimeStamp>2016-04-19T12:30:16.52+10:00</DateTimeStamp>
   </Header>
   <StockMovementData>
      <Serialised_Material>YES</Serialised_Material>
      <DateTime>2016-04-19T12:30:16.52+10:00</DateTime>
      <From_Location>0030-0080</From_Location>
      <To_Location>ACTSTRBNE</To_Location>
      <Material>7CAGL3G01</Material>
      <Serial>700032561</Serial>
      <Quantity>1</Quantity>
   </StockMovementData>
   <StockMovementData>
      <Serialised_Material>YES</Serialised_Material>
      <DateTime>2016-04-19T12:30:16.52+10:00</DateTime>
      <From_Location>0030-0080</From_Location>
      <To_Location>ACTSTRBNE</To_Location>
      <Material>7CAGL3G01</Material>
      <Serial>700032562</Serial>
      <Quantity>1</Quantity>
   </StockMovementData>
</StockMovementDataRequest>

啊
液
9abb2454-068d-11e6-8f1b-509e20524153
2016-04-19T12:30:16.52+10:00
对
2016-04-19T12:30:16.52+10:00
0030-0080
ACTSTRBNE
7CAGL3G01
700032561
1.
对
2016-04-19T12:30:16.52+10:00
0030-0080
ACTSTRBNE
7CAGL3G01
700032562
1.
XSL翻译

    <?xml version='1.0' ?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:variable name="Serial" select="substring(StockMovementDataRequest/StockMovementData/Serial, 0, 9)" /><xsl:variable name="count" select="StockMovementDataRequest/StockMovementData/Quantity" /><xsl:variable name="temp" select="1" />
<xsl:output method="xml" indent="yes"/>
<xsl:call-template name="selects">
               <xsl:with-param name="i">1</xsl:with-param>
               <xsl:with-param name="counter">
               <xsl:value-of select="$count" />
               </xsl:with-param>
            </xsl:call-template>
    <xsl:template match="/">
        <StockMovementDataRequest xmlns:p1="urn:ams.com.au:dynamo:3pl:am:SAP_AM_I_005:StockMovement" xmlns:a="http://www.edi.com.au/EnterpriseService/">
            <Header>
                <From>
                    <xsl:value-of select="StockMovementDataRequest/Header/From"/>
                </From>
                <To>
                    <xsl:value-of select="StockMovementDataRequest/Header/To"/>
                </To>
                <Unique_ID>
                    <xsl:value-of select="StockMovementDataRequest/Header/Unique_ID"/>
                </Unique_ID>
                <DateTimeStamp>
                    <xsl:value-of select="StockMovementDataRequest/Header/DateTimeStamp"/>
                </DateTimeStamp>
            </Header>

        <xsl:template name="StockMovementData">
        <xsl:param name="i" />
        <xsl:param name="counter" />

        <xsl:if test="$i &lt;= $counter">
          <StockMovementData>
            <xsl:apply-templates select="StockMovementDataRequest/StockMovementData"/>
          </StockMovementData>
        </xsl:if>

        <!--begin_: RepeatTheLoopUntilFinished-->
        <xsl:if test="$i &lt;= $counter">
            <xsl:call-template name="StockMovementData">
                <xsl:with-param name="i">
                    <xsl:value-of select="$i + 1"/>
                </xsl:with-param>
                <xsl:with-param name="counter">
                    <xsl:value-of select="$counter"/>
                </xsl:with-param>
            </xsl:call-template>
        </xsl:if>
        </xsl:template>

        </StockMovementDataRequest>
    </xsl:template>
    <xsl:template match="StockMovementDataRequest/StockMovementData">
        <Serialised_Material>
                    <xsl:value-of select="Serialised_Material"/>
                </Serialised_Material>
                <DateTime>
                    <xsl:value-of select="DateTime"/>
                </DateTime>
                <From_Location>
                    <xsl:value-of select="From_Location"/>
                </From_Location>
                <To_Location>
                    <xsl:value-of select="To_Location"/>
                </To_Location>
                <Material>
                    <xsl:value-of select="Material"/>
                </Material>
                <Serial>
                    <xsl:value-of select="$Serial"/>
                </Serial>
                <Quantity>
                    <xsl:value-of select="1" />
                </Quantity>     
    </xsl:template> </xsl:stylesheet>

1.
重复第100段,直到我到达序列号范围的末尾

再次感谢

简单地说:

XSLT1.0

<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="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="StockMovementData" name="replicate">
    <xsl:param name="i" select="1"/>
    <xsl:copy>
        <xsl:apply-templates select="@*|node()[not(self::Serial or self::Quantity)]"/>
        <Serial>
            <xsl:value-of select="substring-before(Serial, ' -' ) + $i - 1"/>
        </Serial>
        <Quantity>1</Quantity>
    </xsl:copy>
    <xsl:if test="$i &lt; Quantity">
        <xsl:call-template name="replicate">
            <xsl:with-param name="i" select="$i + 1"/>
        </xsl:call-template>
    </xsl:if>   
</xsl:template>

</xsl:stylesheet>

1.
请注意,这假设每个
StockMovementData
数量大于1,并且
序列包含一系列数字


如果没有,您可以将模板限制为
match=“StockMovementData[Quantity>1]”

共享您目前在XSL中所做的工作,否则看起来您需要有人来完成您的工作:PHi david,很抱歉没有包括我的转换,因为它仍在进行中,无法生成结构化XML文件。嗨,michael,感谢您提供了非常有用的解决方案。我可以用一个变量替换序列号的值,并在每个循环中增加一个吗?@PaulD。对不起,我错过了那部分。查看编辑后的版本。再次感谢Michael!我在想你是怎么得到序列号的?对于我的示例,输出为“NaN”input@PaulD. 你在使用哪个XSLT处理器?嗨,Michael,我的错。它现在工作得很好。谢谢
<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="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="StockMovementData" name="replicate">
    <xsl:param name="i" select="1"/>
    <xsl:copy>
        <xsl:apply-templates select="@*|node()[not(self::Serial or self::Quantity)]"/>
        <Serial>
            <xsl:value-of select="substring-before(Serial, ' -' ) + $i - 1"/>
        </Serial>
        <Quantity>1</Quantity>
    </xsl:copy>
    <xsl:if test="$i &lt; Quantity">
        <xsl:call-template name="replicate">
            <xsl:with-param name="i" select="$i + 1"/>
        </xsl:call-template>
    </xsl:if>   
</xsl:template>

</xsl:stylesheet>