我们的订单以XML形式出现,我们的客户之一正在发送大量圣诞节订单(25mb xml文件),这让我们的系统停滞不前!我需要找到一个合适的方法将这个文件分成几个x大小或y个订单的文件。我可以用一个简单的控制台应用程序来做到这一点,但我想知道我是否可以使用XSLT完成?
我想为这个例子一次选择2个元素。有没有一种跳过和采取风格的方法呢?
示例订单文件:
<order>
<customerName>Customer 1</customerName>
<orderID>001</orderID>
<orderItem>
<itemID>001</itemID>
<quantity>12</quantity>
</orderItem>
<orderItem>
<itemID>002</itemID>
<quantity>15</quantity>
</orderItem>
<orderItem>
<itemID>003</itemID>
<quantity>120</quantity>
</orderItem>
<orderItem>
<itemID>004</itemID>
<quantity>1223</quantity>
</orderItem>
<orderItem>
<itemID>005</itemID>
<quantity>22</quantity>
</orderItem>
<orderItem>
<itemID>006</itemID>
<quantity>78</quantity>
</orderItem>
</order>
我想将其拆分为每个包含2个orderItem的XML文档:
文件1:
<order>
<customerName>Customer 1</customerName>
<orderID>001</orderID>
<orderItem>
<itemID>001</itemID>
<quantity>12</quantity>
</orderItem>
<orderItem>
<itemID>002</itemID>
<quantity>15</quantity>
</orderItem>
</order>
文件2:
<order>
<customerName>Customer 1</customerName>
<orderID>001</orderID>
<orderItem>
<itemID>003</itemID>
<quantity>120</quantity>
</orderItem>
<orderItem>
<itemID>004</itemID>
<quantity>1223</quantity>
</orderItem>
</order>
文件3:
<order>
<customerName>Customer 1</customerName>
<orderID>001</orderID>
<orderItem>
<itemID>005</itemID>
<quantity>22</quantity>
</orderItem>
<orderItem>
<itemID>006</itemID>
<quantity>78</quantity>
</orderItem>
</order>
由于
答案 0 :(得分:2)
我的理解是你只能使用XSLT 1.0。
在这种情况下,您可以使用 MVP-XML project and its EXSLT.NET component 。
更具体地说,您将使用 <exsl:document>
扩展元素从同一转换中生成多个输出。
答案 1 :(得分:0)
如果您应用此XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes" method="xml"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- split file up into order elements -->
<xsl:template match="orderItem[position() mod 2 = 1]">
<order>
<xsl:copy-of select=".|following-sibling::orderItem[not(position() > 1)]"/>
</order>
</xsl:template>
<xsl:template match="orderItem"/>
</xsl:stylesheet>
到您的源XML,您将获得此输出XML:
<?xml version="1.0" encoding="UTF-8"?>
<order>
<customerName>Customer 1</customerName>
<orderID>001</orderID>
<order>
<orderItem>
<itemID>001</itemID>
<quantity>12</quantity>
</orderItem>
<orderItem>
<itemID>002</itemID>
<quantity>15</quantity>
</orderItem>
</order>
<order>
<orderItem>
<itemID>003</itemID>
<quantity>120</quantity>
</orderItem>
<orderItem>
<itemID>004</itemID>
<quantity>1223</quantity>
</orderItem>
</order>
<order>
<orderItem>
<itemID>005</itemID>
<quantity>22</quantity>
</orderItem>
<orderItem>
<itemID>006</itemID>
<quantity>78</quantity>
</orderItem>
</order>
</order>
问题是您的系统是否支持此拆分。我正在使用的那个支持它并自动添加<?xml version="1.0" encoding="UTF-8"?>
,因此拆分订单将是单独的XML,并逐个处理。
也许试一试。
祝你好运, 彼得