2017-04-07 14 views
0

XSLTソートについての既存の記事をすべて見てきましたが、ソートの適切な判断はまだできません。 最初に子ノードをソート(降順)し、最初の(最大)子値に基づいて親ノードを降順で並べ替える必要があります。XSLTソート親ノードは最大子ノードに基づいています

だから、私は、最終的な順序NAME3、名1、Name2はが必要ですが、私は名1、NAME3、Name2はを持っています。

解決策を見つける手助けをしてください。前もって感謝します!

入力XML:

<collection> 
<products> 
    <product> 
     <productCode>001</productCode> 
     <productName>Name1</productName> 
     <subProducts> 
      <subProduct> 
       <prices> 
        <price> 
         <totalPrice>264.28</totalPrice> 
        </price>      
       </prices> 
      </subProduct> 
      <subProduct> 
       <prices> 
        <price> 
         <totalPrice>264.28</totalPrice> 
        </price> 
       </prices> 
      </subProduct>        
     </subProducts> 
    </product> 
    <product> 
     <productCode>002</productCode> 
     <productName>Name2</productName> 
     <subProducts> 
      <subProduct> 
       <prices> 
        <price> 
         <totalPrice>231.99</totalPrice> 
        </price> 
        <price> 
         <totalPrice>231.99</totalPrice> 
        </price> 
       </prices> 
      </subProduct> 
      <subProduct> 
       <prices> 
        <price> 
         <totalPrice>231.99</totalPrice> 
        </price> 
        <price> 
         <totalPrice>231.99</totalPrice> 
        </price> 
       </prices> 
      </subProduct>       
     </subProducts> 
    </product> 
    <product> 
     <productCode>003</productCode> 
     <productName>Name3</productName> 
     <subProducts> 
      <subProduct> 
       <prices> 
        <price> 
         <totalPrice>234.92</totalPrice> 
        </price> 
       </prices> 
      </subProduct> 
      <subProduct> 
       <prices> 
        <price> 
         <totalPrice>734.12</totalPrice> 
        </price>      
       </prices> 
      </subProduct>       
     </subProducts> 
    </product>   
</products> 
</collection> 

出力XML:(予想)

<products> 
<product> 
    <productName>Name3</productName> 
    <price>734.12</price> 
    <price>234.92</price> 
</product> 
<product> 
    <productName>Name1</productName> 
    <price>264.28</price> 
    <price>264.28</price> 
</product> 
<product> 
    <productName>Name2</productName> 
    <price>231.99</price> 
    <price>231.99</price> 
    <price>231.99</price> 
    <price>231.99</price> 
</product> 
</products> 

XSLT変換:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <xsl:copy> 
     <xsl:apply-templates select="/collection/products/product"> 
      <xsl:sort select="subProducts/subProduct[1]/prices/price[1]/totalPrice" data-type="number" order="descending"/>    
     </xsl:apply-templates>   
    </xsl:copy> 
</xsl:template> 

<xsl:template match="/collection/products/product">  
    <xsl:copy>   
     <productName> 
      <xsl:value-of select="productName"/> 
     </productName>   
     <xsl:apply-templates select="subProducts/subProduct/prices/price"> 
      <xsl:sort select="totalPrice" order="descending" data-type="number"/> 
     </xsl:apply-templates>   
    </xsl:copy> 
</xsl:template> 

<xsl:template match="subProducts/subProduct/prices/price"> 
    <xsl:copy> 
     <xsl:value-of select="totalPrice"/> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

間違ったXML出力:http://xsltransform.net/3Mvmrzh/1

<products> 
<product> 
    <productName>Name1</productName> 
    <price>264.28</price> 
    <price>264.28</price> 
</product> 
<product> 
    <productName>Name3</productName> 
    <price>734.12</price> 
    <price>234.92</price> 
</product> 
<product> 
    <productName>Name2</productName> 
    <price>231.99</price> 
    <price>231.99</price> 
    <price>231.99</price> 
    <price>231.99</price> 
</product> 
</products> 
+0

どのXSLTプロセッサを使用しますか?拡張機能をサポートしていない純粋なXSLT 1.0では、2回のパスでこれを行う必要があります。 –

+0

@ michael.hor257k Xalanを使用する機会があります – MsPineapple

答えて

0

あなたはXalanのプロセッサを使用している場合は、EXSLT math:max() extension function:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:math="http://exslt.org/math" 
extension-element-prefixes="math"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <products> 
     <xsl:apply-templates select="collection/products/product"> 
      <xsl:sort select="math:max(subProducts/subProduct/prices/price/totalPrice)" data-type="number" order="descending"/>    
     </xsl:apply-templates>   
    </products> 
</xsl:template> 

<xsl:template match="product">  
    <xsl:copy>   
     <xsl:copy-of select="productName"/> 
     <xsl:apply-templates select="subProducts/subProduct/prices/price"> 
      <xsl:sort select="totalPrice" data-type="number" order="descending"/> 
     </xsl:apply-templates>   
    </xsl:copy> 
</xsl:template> 

<xsl:template match="price"> 
    <xsl:copy> 
     <xsl:value-of select="totalPrice"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

デモを活用することができます

+0

ありがとうございました!私は正常に私のコードでこれをテストしました。 – MsPineapple

関連する問題