2012-07-17 131 views
4

我有下面的XML文檔:XSLT 1.0元素進行排序

<?xml version="1.0" encoding="UTF-8"?> 
<objects> 
    <object>Clutch</object> 
    <object>Gearbox</object> 
    <object>Cylinder head</object> 
    <object>Starter</object> 
    <object>Airbox</object> 
    <object>Inlet manifold</object> 
</objects> 

而下面的XSLT文件:

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

    <xsl:template match="objects"> 
     <parts> 
      <xsl:apply-templates> 
       <xsl:sort select="object"/> 
      </xsl:apply-templates> 
     </parts> 
    </xsl:template> 

    <xsl:template match="object"> 
     <part> 
      <xsl:apply-templates/> 
     </part> 
    </xsl:template> 

</xsl:stylesheet> 

當應用於我得到以下輸出符合市場預期,但它沒有被排序:

<?xml version="1.0" encoding="UTF-8"?> 
<parts> 
    <part>Clutch</part> 
    <part>Gearbox</part> 
    <part>Cylinder head</part> 
    <part>Starter</part> 
    <part>Airbox</part> 
    <part>Inlet manifold</part> 
</parts> 

爲什麼<xsl:sort select="object"/>沒有被應用?

回答

7

原因是在這裏:

​​

這適用模板當前節點(objects)的兒童(object),並通過他們的第一個object孩子的字符串值對其進行排序。

但是,在提供的XML文檔中,object沒有任何object孩子 - 因此它們都具有相同的排序鍵 - 空字符串 - 並且它們的原始順序不會被排序操作更改。

 <parts> 
      <xsl:apply-templates> 
       <xsl:sort select="."/> 
      </xsl:apply-templates> 
     </parts> 

的完全轉變成爲

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

<xsl:template match="objects"> 
    <parts> 
    <xsl:apply-templates> 
     <xsl:sort select="."/> 
    </xsl:apply-templates> 
    </parts> 
</xsl:template> 

<xsl:template match="object"> 
    <part> 
    <xsl:apply-templates/> 
    </part> 
</xsl:template> 
</xsl:stylesheet> 

,當它被施加到所提供的XML文檔:

<objects> 
    <object>Clutch</object> 
    <object>Gearbox</object> 
    <object>Cylinder head</object> 
    <object>Starter</object> 
    <object>Airbox</object> 
    <object>Inlet manifold</object> 
</objects> 

的希望,正確的結果產生:

<parts> 
    <part>Airbox</part> 
    <part>Clutch</part> 
    <part>Cylinder head</part> 
    <part>Gearbox</part> 
    <part>Inlet manifold</part> 
    <part>Starter</part> 
</parts> 
+0

感謝。我與我的實際代碼的問題,但並不過,使用這個例子會幫助我。任何機會,你可以看看沉綿其實我已經知道了現在的工作。 http://stackoverflow.com/questions/11523678/xslt-1-0-sort-on-filtered-xml-data – 2012-07-17 15:47:03

+1

@generalexception:我在工作 - 將在7看看 - 8小時。 – 2012-07-17 16:45:35