2017-02-03 78 views
0

我想一些元素移動到按屬性「郵件ID」XSLT 1.0:移動元素父的底部,並將其分類

這裏他們的父母和秩序它們的底部是XML

<Root> 
<parent> 
<child/> 
<child2 messageid="8"/> 
<child/> 
<child2 messageid="5"/> 
<child/> 
<child2 messageid="7"/> 
</parent> 
</Root> 

這裏是想要的XML輸出

<Root> 
<parent> 
<child/> 
<child/> 
<child/> 
<child2 messageid="5"/> 
<child2 messageid="7"/> 
<child2 messageid="8"/> 
</parent> 
</Root> 

我想我需要使用XSL:複製,但我不知道該怎麼做。感謝您的幫助

+0

哪一些應該是底部?元素child2或所有具有messageid屬性的元素?只有底部的那個才能被分類? – Lucero

+0

對不起,是的,所有的child2元素必須在最下面,它們必須按messageid排序。 – CRT

回答

0

像這樣的東西應該工作:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="parent"> 
    <xsl:copy> 
     <xsl:copy-of select="@*" /> 
     <xsl:apply-templates select="*[not(self::child2)]" /> 
     <xsl:apply-templates select="child2"> 
     <xsl:sort data-type="number" select="@messageid" /> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 

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

謝謝它的工作,只有當我在類型中刪除模式=數字:) – CRT

+0

@CRT右,該屬性應該被稱爲'數據類型 - 固定的。請注意,如果沒有,它會進行文本排序,例如「10」被認爲小於「2」。 – Lucero

+0

arf確定但它不好於10被認爲小於2.有沒有辦法解決這個問題?你應該稱之爲數據類型是什麼意思? – CRT

0

這可能是更容易。
使用parent節點上略加修改的身份模板,似乎做的工作:

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

    <!-- slightly modified identity template --> 
    <xsl:template match="parent"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"> 
     <xsl:sort select="@messageid"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 

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

</xsl:stylesheet>