1

私たちの注文はXMLとして届き、お客様の1人がクリスマスの大量注文(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>
4

2 に答える 2

2

私の理解では、XSLT1.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になり、それらは1つずつ処理されます。

于 2012-11-16T09:36:57.410 に答える