0

いくつかの値に基づいて xml ファイルを並べ替える必要があります。入力 xml の構造は次のとおりです。

<DataSet>
<Product>
    <Category>100</Category>
    <ProductGroup>2000</ProductGroup>
    <ProductNr>30003</ProductNr>
</Product>  
<Product>
    <Category>100</Category>
    <ProductGroup>2000</ProductGroup>
    <ProductNr>30001</ProductNr>
</Product>  
<Product>
    <Category>100</Category>
    <ProductGroup>1000</ProductGroup>
    <ProductNr>30002</ProductNr>
</Product>
<Product>
    <Category>100</Category>
    <ProductGroup>1000</ProductGroup>
    <ProductNr>30004</ProductNr>
</Product>
<Product>
    <Category>100</Category>
    <ProductGroup>1000</ProductGroup>
    <ProductNr>30010</ProductNr>
</Product>
<Product>
    <Category>200</Category>
    <ProductGroup>3000</ProductGroup>
    <ProductNr>30006</ProductNr>
</Product>
<Product>
    <Category>200</Category>
    <ProductGroup>4000</ProductGroup>
    <ProductNr>30009</ProductNr>
</Product>
<Product>
    <Category>200</Category>
    <ProductGroup>4000</ProductGroup>
    <ProductNr>30007</ProductNr>
</Product>
<Product>
    <Category>200</Category>
    <ProductGroup>3000</ProductGroup>
    <ProductNr>30005</ProductNr>
</Product>

この xml は、Category で並べ替え、次に ProductNr で並べ替えますが、ProductGroup でグループ化する必要があります。つまり、ProductGroup 2000 に ProductGroup 1000 よりも小さい ProductNr を持つ製品がある場合、ProductGroup 2000 は ProductGroup 1000 の前に印刷される必要があります。

出力 xml は次のようになります。

<DataSet>
<Product>
    <Category>100</Category>
    <ProductGroup>2000</ProductGroup>
    <ProductNr>30001</ProductNr>
</Product>  
<Product>
    <Category>100</Category>
    <ProductGroup>2000</ProductGroup>
    <ProductNr>30003</ProductNr>
</Product>  
<Product>
    <Category>100</Category>
    <ProductGroup>1000</ProductGroup>
    <ProductNr>30002</ProductNr>
</Product>
<Product>
    <Category>100</Category>
    <ProductGroup>1000</ProductGroup>
    <ProductNr>30004</ProductNr>
</Product>
<Product>
    <Category>100</Category>
    <ProductGroup>1000</ProductGroup>
    <ProductNr>30010</ProductNr>
</Product>
<Product>
    <Category>200</Category>
    <ProductGroup>3000</ProductGroup>
    <ProductNr>30005</ProductNr>
</Product>
<Product>
    <Category>200</Category>
    <ProductGroup>3000</ProductGroup>
    <ProductNr>30006</ProductNr>
</Product>
<Product>
    <Category>200</Category>
    <ProductGroup>4000</ProductGroup>
    <ProductNr>30007</ProductNr>
</Product>
<Product>
    <Category>200</Category>
    <ProductGroup>4000</ProductGroup>
    <ProductNr>30009</ProductNr>
</Product>

今、私の考えは、次のロジックに基づいてソート目的のキーを生成することです: key = Category + (smallest ProductNr in ProductGroup) + ProductNr

次に、このキーで並べ替えて、正しい結果を得ることができます。

XSLT は初めてで、ProductGroup 内の最小の ProductNr を計算し、この値で並べ替える方法がわかりません。ヒントを教えてください。

または: このタスクを解決するためのより良いテクノロジはありますか?

4

1 に答える 1

0

これはそれを行う必要があります:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
  <xsl:key name="kProdInGroup" match="ProductNr" use="../ProductGroup" />

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

  <xsl:template match="/*">
    <xsl:copy>
      <xsl:apply-templates select="Product">
        <!-- First sort by Category -->
        <xsl:sort select="Category" data-type="number" />
        <!-- Then by the min ProductNr per group -->
        <xsl:sort select="key('kProdInGroup', ProductGroup)
                             [not(. &gt; key('kProdInGroup', ../ProductGroup))]"
                  data-type="number" />
        <!-- Then by ProductNr -->
        <xsl:sort select="ProductNr" data-type="number" />
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

サンプル入力に適用すると、結果は次のようになります。

<DataSet>
  <Product>
    <Category>100</Category>
    <ProductGroup>2000</ProductGroup>
    <ProductNr>30001</ProductNr>
  </Product>
  <Product>
    <Category>100</Category>
    <ProductGroup>2000</ProductGroup>
    <ProductNr>30003</ProductNr>
  </Product>
  <Product>
    <Category>100</Category>
    <ProductGroup>1000</ProductGroup>
    <ProductNr>30002</ProductNr>
  </Product>
  <Product>
    <Category>100</Category>
    <ProductGroup>1000</ProductGroup>
    <ProductNr>30004</ProductNr>
  </Product>
  <Product>
    <Category>100</Category>
    <ProductGroup>1000</ProductGroup>
    <ProductNr>30010</ProductNr>
  </Product>
  <Product>
    <Category>200</Category>
    <ProductGroup>3000</ProductGroup>
    <ProductNr>30005</ProductNr>
  </Product>
  <Product>
    <Category>200</Category>
    <ProductGroup>3000</ProductGroup>
    <ProductNr>30006</ProductNr>
  </Product>
  <Product>
    <Category>200</Category>
    <ProductGroup>4000</ProductGroup>
    <ProductNr>30007</ProductNr>
  </Product>
  <Product>
    <Category>200</Category>
    <ProductGroup>4000</ProductGroup>
    <ProductNr>30009</ProductNr>
  </Product>
</DataSet>
于 2013-03-18T17:15:40.433 に答える