簡體   English   中英

XSLT 1.0排序元素

[英]XSLT 1.0 sort elements

我有以下XML文檔:

<?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"/>

原因在於:

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

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

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

方案

        <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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM