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 中有一个 ProductNr 小于 ProductGroup 1000 中的 Product,那么 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 回答