你如何在 mule 中拆分 XML?分离器?
How do you split XMLs in mule? splitter?
我对拆分 XML 有点陌生,你能帮我从一个输入创建多个 XML 吗?我需要使用分离器吗? XSLT?另外,我也可以在 xml 中添加消息 ID 吗?
输入
<?xml version="1.0"?>
<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>Warehouse</From>
<To>Location</To>
<Unique_ID>idm1468201212</Unique_ID>
<DateTimeStamp>2016-04-13T11:55:30.263+10:00</DateTimeStamp>
</Header>
<StockMovementData>
<Serialised_Material>YES</Serialised_Material>
<DateTime>2016-04-13T11:55:30.263+10:00</DateTime>
<From_Location>30-80</From_Location>
<To_Location>client</To_Location>
<Material>7CAGL3G00</Material>
<Serial>700030011</Serial>
<Quantity>100</Quantity>
</StockMovementData>
<StockMovementData>
<Serialised_Material>YES</Serialised_Material>
<DateTime>2016-04-13T11:55:30.263+10:00</DateTime>
<From_Location>30-80</From_Location>
<To_Location>client</To_Location>
<Material>7CAGL3G00</Material>
<Serial>700029911</Serial>
<Quantity>100</Quantity>
</StockMovementData>
</StockMovementDataRequest>
输出
<?xml version="1.0"?>
<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>warehouse</From>
<To>client</To>
<Unique_ID>idm1467386212</Unique_ID>
<DateTimeStamp>2016-04-13T11:55:30.263+10:00</DateTimeStamp>
</Header>
<StockMovementData>
<Serialised_Material>YES</Serialised_Material>
<DateTime>2016-04-13T11:55:30.263+10:00</DateTime>
<From_Location>30-80</From_Location>
<To_Location>client</To_Location>
<Material>7CAGL3G00</Material>
<Serial>700030011</Serial>
<Quantity>100</Quantity>
</StockMovementData>
</StockMovementDataRequest>
和
<?xml version="1.0"?>
<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>warehouse</From>
<To>client</To>
<Unique_ID>idm1467386212</Unique_ID>
<DateTimeStamp>2016-04-13T11:55:30.263+10:00</DateTimeStamp>
</Header>
<StockMovementData>
<Serialised_Material>YES</Serialised_Material>
<DateTime>2016-04-13T11:55:30.263+10:00</DateTime>
<From_Location>30-80</From_Location>
<To_Location>client</To_Location>
<Material>7CAGL3G00</Material>
<Serial>700029911</Serial>
<Quantity>100</Quantity>
</StockMovementData>
</StockMovementDataRequest>
有什么想法吗?
如果您的处理器支持 XSLT-2.0,您可以试试下面的代码:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:for-each select="StockMovementDataRequest/StockMovementData">
<xsl:result-document href="{concat('output', position(), '.xml')}">
<StockMovementDataRequest xmlns:p1="urn:ams.com.au:dynamo:3pl:am:SAP_AM_I_005:StockMovement" xmlns:a="http://www.edi.com.au/EnterpriseService">
<xsl:apply-templates select="preceding-sibling::Header"/>
<xsl:apply-templates select="."/>
</StockMovementDataRequest>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
它根据您的输入输出 output1.xml 和 output2.xml。
使用Mule Splitter
拆分xml
<splitter expression="#[xpath3('//StockMovementDataRequest/StockMovementData',payload,'NODESET')]" doc:name="Splitter"/>
<mulexml:dom-to-xml-transformer doc:name="DOM to XML"/>
要在拆分器后聚合有效负载,请使用 aggregator
<collection-aggregator doc:name="Collection Aggregator"/>
在此处查看更多文档
https://docs.mulesoft.com/mule-user-guide/v/3.7/splitter-flow-control-reference
我对拆分 XML 有点陌生,你能帮我从一个输入创建多个 XML 吗?我需要使用分离器吗? XSLT?另外,我也可以在 xml 中添加消息 ID 吗?
输入
<?xml version="1.0"?>
<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>Warehouse</From>
<To>Location</To>
<Unique_ID>idm1468201212</Unique_ID>
<DateTimeStamp>2016-04-13T11:55:30.263+10:00</DateTimeStamp>
</Header>
<StockMovementData>
<Serialised_Material>YES</Serialised_Material>
<DateTime>2016-04-13T11:55:30.263+10:00</DateTime>
<From_Location>30-80</From_Location>
<To_Location>client</To_Location>
<Material>7CAGL3G00</Material>
<Serial>700030011</Serial>
<Quantity>100</Quantity>
</StockMovementData>
<StockMovementData>
<Serialised_Material>YES</Serialised_Material>
<DateTime>2016-04-13T11:55:30.263+10:00</DateTime>
<From_Location>30-80</From_Location>
<To_Location>client</To_Location>
<Material>7CAGL3G00</Material>
<Serial>700029911</Serial>
<Quantity>100</Quantity>
</StockMovementData>
</StockMovementDataRequest>
输出
<?xml version="1.0"?>
<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>warehouse</From>
<To>client</To>
<Unique_ID>idm1467386212</Unique_ID>
<DateTimeStamp>2016-04-13T11:55:30.263+10:00</DateTimeStamp>
</Header>
<StockMovementData>
<Serialised_Material>YES</Serialised_Material>
<DateTime>2016-04-13T11:55:30.263+10:00</DateTime>
<From_Location>30-80</From_Location>
<To_Location>client</To_Location>
<Material>7CAGL3G00</Material>
<Serial>700030011</Serial>
<Quantity>100</Quantity>
</StockMovementData>
</StockMovementDataRequest>
和
<?xml version="1.0"?>
<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>warehouse</From>
<To>client</To>
<Unique_ID>idm1467386212</Unique_ID>
<DateTimeStamp>2016-04-13T11:55:30.263+10:00</DateTimeStamp>
</Header>
<StockMovementData>
<Serialised_Material>YES</Serialised_Material>
<DateTime>2016-04-13T11:55:30.263+10:00</DateTime>
<From_Location>30-80</From_Location>
<To_Location>client</To_Location>
<Material>7CAGL3G00</Material>
<Serial>700029911</Serial>
<Quantity>100</Quantity>
</StockMovementData>
</StockMovementDataRequest>
有什么想法吗?
如果您的处理器支持 XSLT-2.0,您可以试试下面的代码:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:for-each select="StockMovementDataRequest/StockMovementData">
<xsl:result-document href="{concat('output', position(), '.xml')}">
<StockMovementDataRequest xmlns:p1="urn:ams.com.au:dynamo:3pl:am:SAP_AM_I_005:StockMovement" xmlns:a="http://www.edi.com.au/EnterpriseService">
<xsl:apply-templates select="preceding-sibling::Header"/>
<xsl:apply-templates select="."/>
</StockMovementDataRequest>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
它根据您的输入输出 output1.xml 和 output2.xml。
使用Mule Splitter
拆分xml
<splitter expression="#[xpath3('//StockMovementDataRequest/StockMovementData',payload,'NODESET')]" doc:name="Splitter"/>
<mulexml:dom-to-xml-transformer doc:name="DOM to XML"/>
要在拆分器后聚合有效负载,请使用 aggregator
<collection-aggregator doc:name="Collection Aggregator"/>
在此处查看更多文档 https://docs.mulesoft.com/mule-user-guide/v/3.7/splitter-flow-control-reference