如何在xslt中基于段标记中的值重申XML?骡子?
我试图重申一个基于xml值中quantity标记内的值的段。这将再次用于增加另一个标记的值 输入如何在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
啊
液
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 <= $counter">
<StockMovementData>
<xsl:apply-templates select="StockMovementDataRequest/StockMovementData"/>
</StockMovementData>
</xsl:if>
<!--begin_: RepeatTheLoopUntilFinished-->
<xsl:if test="$i <= $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 < 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 < Quantity">
<xsl:call-template name="replicate">
<xsl:with-param name="i" select="$i + 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>