1

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

2 回答 2

2

我的理解是您仅限于 XSLT 1.0。

在这种情况下,您可以使用MVP-XML 项目及其 EXSLT.NET 组件

更具体地说,您将使用<exsl:document>扩展元素从同一个转换中生成多个输出。

于 2012-11-16T13:26:23.027 回答
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,并且这些订单会被一一处理。

于 2012-11-16T09:36:57.410 回答