【问题标题】:XSLT Split XML file using Skip and Take like approachXSLT 使用 Skip and Take like 方法拆分 XML 文件
【发布时间】:2012-11-16 09:20:03
【问题描述】:

我们的订单以 XML 格式输入,我们的一位客户现在发送大量圣诞节订单(25mb xml 文件),这几乎使我们的系统陷入瘫痪!我需要找到一种体面的方法来将此文件拆分为多个 x 大小或 y 个订单的文件。我可以用一个简单的控制台应用程序来做到这一点,但我想知道我是否可以用 XSLT 来做到这一点?

我想在这个例子中一次选择 2 个元素。有没有一种skip and take风格的方法?

订单文件示例:

<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>

【问题讨论】:

  • 您是否使用像 Saxon 9 或 AltovaXML 或 XmlPrime 这样的 XSLT 2.0 处理器?使用 XSLT 2.0,您可以使用 xsl:result-document 使用一个样式表创建多个结果文件。

标签: xml xslt


【解决方案1】:

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

在这种情况下,您可以使用 MVP-XML project and its EXSLT.NET component

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

【讨论】:

    【解决方案2】:

    如果应用此 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>
    

    问题是您的系统是否支持这种拆分。我正在使用的支持它并自动添加&lt;?xml version="1.0" encoding="UTF-8"?&gt;,因此拆分订单将是单独的 XML,并且这些订单将被一一处理。

    【讨论】:

    • 嗨,彼得。感谢您的回复,但我们的系统不支持。 XML 文件被添加到 MSMQ 并依次处理。我需要拆分来排队 10 个小文件而不是 1 个大文件。谢谢
    • 您好,请查看 Dimitre 在此线程中的回答:stackoverflow.com/questions/12160014/… 我希望对您有所帮助。最好的问候,彼得
    猜你喜欢
    • 2017-05-30
    • 2011-11-13
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    相关资源
    最近更新 更多