XSLT使用Skip和Take方法拆分XML文件

时间:2012-11-16 09:20:04

标签: xml xslt

我们的订单以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>

由于

2 个答案:

答案 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,并逐个处理。

也许试一试。

祝你好运, 彼得