2012-10-31 134 views
1

我熟悉XSLT的基礎知識,但我遇到了一個奇怪的情況,我似乎無法弄清楚。我很抱歉這麼久,但我會很感激你能提供的任何幫助。按多個元素排序

我想根據排序的品牌/價值/ @名稱和文件/價值/ @名稱的串聯,從而易排序Level_5

XML unsorted: 
<Root att="x"> 
    <Level_1 Name="NEW Level">  
    <Level_2>  
     <Level_3 Name="nameLvl_3">   
     <Level_4>  
      <Level_5 Name="aa"> 
      <Brand> 
       <Value Name="Text" Value="1" /> 
      </Brand>    
     <Docs> 
       <Value Name="Pro" Value="2" /> 
       <Value Name="Numeric" Value="0.05" /> 
      </Docs>    
      </Level_5>    
      <Level_5 Name="aa">    
      <Text> 
       <Val Id="1"/> 
      </Text> 
      </Level_5> 
      <Level_5 Name="aa"> 
      <Brand> 
       <Value Name="Text" Value="2" /> 
       <Value Name="Number" Value="1" /> 
       <Value Name="Long" Value="3" /> 
      </Brand> 
      </Level_5> 
     </Level_4> 
     </Level_3> 
    </Level_2>  
    </Level_1> 
</Root> 

你做拼接後,您應該排序Level_5節點, 「」 LongNumberText,TextNumericPro 和預期輸出是:

<Root att="x"> 
    <level_1 Name="NEW Level">  
    <level_2>  
     <Level_3 Name="nameLvl_3">   
     <Level_4> 
      <Level_5 Name="aa">    
      <Text> 
       <Val Id="1"/> 
      </Text> 
      </Level_5> 
      <Level_5 Name="aa"> 
      <Brand> 
      <Value Name="Long" Value="3" /> 
     <Value Name="Number" Value="1" /> 
       <Value Name="Text" Value="2" />    
      </Brand> 
      </Level_5> 
      <Level_5 Name="aa"> 
      <Brand> 
       <Value Name="Text" Value="1" /> 
      </Brand>    
    <Docs>   
       <Value Name="Numeric" Value="0.05" /> 
       <Value Name="Pro" Value="2" /> 
      </Docs>    
      </Level_5> 
     </Level_4> 
     </Level_3> 
    </Level_2>  
    </Level_1> 
</Root> 

我只能排序的/品牌/價值/ @名稱的第一個元素,但我沒有任何想法如何拼接的休息品牌和文檔內的屬性,這是代碼即時NG:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="Level_3/Level_4/Level_5/Brand|Docs"> 
    <xsl:copy> 
     <xsl:apply-templates> 
     <xsl:sort select="@Name" data-type="text"/> 
     <xsl:sort select="@Value" data-type="text"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 

    <!--             --> 
    <xsl:template match="Level_2/Level_3/Level_4"> 
    <xsl:copy> 
     <xsl:apply-templates select="Level_5"> 
     <xsl:sort select="Brand|Docs/Value/@Name" data-type="text"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

但我只是排序再見品牌的內部或文檔請任何幫助的第一個元素

回答

0

有可能是一個聰明的方式在XPath 1.0表達式要做到這一點,但我不看到一個。更直接的方法是分兩步處理數據。

首先編寫一個執行近似身份轉換的樣式表:輸入只是按原樣寫回輸出,但在每個Level_5元素上添加一個屬性,並使用sort-key,通過處理所有合適的孩子進入make-sort-key模式。

然後編寫其他樣式表並使用sort-key屬性來控制排序(如果您不想要它,請再次放下它)。

關於另一個話題:匹配模式Level_3/Level_4/Level_5/Brand | Docs不等於Level_3/Level_4/Level_5/Brand | Level_3/Level_4/Level_5/Docs。如果你的意思是後者,你需要一個不同的匹配模式。

+0

我已經做了兩步,但我被限制在一步做到這一點 – user1789798