0

XSLTを使用した場合にのみ解決できる問題があります。問題は、同じIDを持つ重複したXMLタグが必要ないことですが、複数のタグがあるシナリオでは、両方のタグの数量フィールドを合計する必要があります。これは、以下のXMLで簡単に示すことができます。

入力XML

<root>
    <Line>
        <Id>4</Id>
        <sku>111111</sku>
        <quantity>1</quantity>
    </Line>
    <Line>
        <Id>4</Id>
        <sku>111111</sku>
        <quantity>2</quantity>
    </Line>
    <Line>
        <Id>3</Id>
        <sku>222222</sku>
        <quantity>1</quantity>
    </Line>
    <Line>
        <Id>3</Id>
        <sku>222222</sku>
        <quantity>1</quantity>
    </Line>
</root>

必要な出力

<root>
    <Line>
        <Id>4</Id>
        <sku>111111</sku>
        <quantity>3</quantity>
    </Line>
    <Line>
        <Id>3</Id>
        <sku>222222</sku>
        <quantity>2</quantity>
    </Line>
</root>

XSLT

XSLTを開始しました

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/root">
        <root>
            <xsl:apply-templates select="orderLine"/>
        </root>
    </xsl:template>

    <xsl:template match="/root/oderLine">
        <xsl:if test="not(sku = preceding-sibling::orderLine/sku)"> </xsl:if>
    </xsl:template>

</xsl:stylesheet>

IDとSKUの両方を比較する

入力

<root>
    <Line>
        <Id>4</Id>
        <sku>111111</sku>
        <quantity>1</quantity>
    </Line>
    <Line>
        <Id>4</Id>
        <sku>111222</sku>
        <quantity>2</quantity>
    </Line>
    <Line>
        <Id>3</Id>
        <sku>222222</sku>
        <quantity>1</quantity>
    </Line>
    <Line>
        <Id>3</Id>
        <sku>222222</sku>
        <quantity>1</quantity>a
    </Line>
</root>

必要な出力

<root>
    <Line>
        <Id>4</Id>
        <sku>111111</sku>
        <quantity>1</quantity>
    </Line>
    <Line>
        <Id>4</Id>
        <sku>111222</sku>
        <quantity>2</quantity>
    </Line>
    <Line>
        <Id>3</Id>
        <sku>222222</sku>
        <quantity>2</quantity>
    </Line>
</root>

実際の出力

<root>
    <Line>
        <Id>4</Id>
        <sku>111111</sku>
        <quantity>3</quantity>
    </Line>
    <Line>
        <Id>3</Id>
        <sku>222222</sku>
        <quantity>2</quantity>
    </Line>
</root>

ご覧のとおり、IDのみが一致しており、SKUも一致していません。

4

1 に答える 1

0

XSLT 1.0では、Muechianグループ化を使用します。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>

<xsl:key name="l-by-id" match="Line" use="Id"/>

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="Line[generate-id() = generate-id(key('l-by-id', Id)[1])]/quantity">
  <xsl:copy>
    <xsl:value-of select="sum(key('l-by-id', ../Id)/quantity)"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="Line[generate-id() != generate-id(key('l-by-id', Id)[1])]"/>

</xsl:stylesheet>

[編集]これは、Idとskuの両方でグループ化するための上記のソリューションの適応です。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>

<xsl:key name="l-by-id" match="Line" use="concat(Id, '|', sku)"/>

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="Line[generate-id() = generate-id(key('l-by-id', concat(Id, '|', sku))[1])]/quantity">
  <xsl:copy>
    <xsl:value-of select="sum(key('l-by-id', concat(../Id, '|', ../sku))/quantity)"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="Line[generate-id() != generate-id(key('l-by-id', concat(Id, '|', sku))[1])]"/>

</xsl:stylesheet>
于 2012-08-09T11:16:16.607 に答える