2012-09-06 95 views
1

我已經經歷了許多類似的問題和XSLT教程,但仍然無法弄清楚XSLT是如何工作的。如何使用基於XML節點屬性值的XSLT進行排序?

下面是我想排序XML: -

<?xml version="1.0" encoding="UTF-8"?> 
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.1" version="1.1"> 
<file product="mxn" source-language="en"> 
<body> 

<!-- Menu --> 

    <msg-unit id="Menu.PerformTask"> 
     <msg>Perform Task</msg> 
     <note>When selected performs a task.</note> 
    </msg-unit> 
    <msg-unit id="Menu.Add"> 
     <msg>Add New</msg> 
     <note>When selected Adds a new row.</note> 
    </msg-unit> 

</body> 
</file> 
</xliff> 

預期成果是: -

<?xml version="1.0" encoding="UTF-8"?> 
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.1" version="1.1"> 
<file product="mxn" source-language="en"> 
<body> 

<!-- Menu --> 

    <msg-unit id="Menu.Add"> 
     <msg>Add New</msg> 
     <note>When selected Adds a new row.</note> 
    </msg-unit> 
    <msg-unit id="Menu.PerformTask"> 
     <msg>Perform Task</msg> 
     <note>When selected performs a task.</note> 
    </msg-unit> 

</body> 
</file> 
</xliff> 

<msg-unit>標籤需要根據自己的id屬性的值進行排序。其他標籤(如評論)應該是他們曾經的地方。

我嘗試了這麼多的組合,但我對XSLT毫無頭緒。以下是我最後一次嘗試。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:template match="/"> 
     <xsl:copy-of select="*"> 
      <xsl:apply-templates> 
       <xsl:sort select="attribute(id)" /> 
      </xsl:apply-templates> 
     </xsl:copy-of> 
    </xsl:template> 
</xsl:stylesheet> 

這一個簡單地吐出任何XML它得到了,沒有任何的排序。

回答

0

編輯更新 - 此模板將僅排序msg-unit元素@id而不會干擾其餘的xml。

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="2.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       > 
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:choose> 
       <xsl:when test="*[local-name()='msg-unit']"> 
        <xsl:apply-templates select="@* | node()"> 
         <xsl:sort select="@id" /> 
        </xsl:apply-templates> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:apply-templates select="@* | node()" /> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

感謝它的工作。雖然''似乎'indent =「yes」'似乎沒有效果。也許''重寫了這個。有沒有方法可以刪除空行而不會鬆動縮進? – AppleGrew

+1

@AppleGrew奇怪,適用於MS解析器。可能嘗試這些空白/漂亮的打印模板之一? http://stackoverflow.com/questions/1134318/xslt-xslstrip-space-does-not-work – StuartLC

相關問題