2013-04-08 62 views
0

現在被這個問題困擾了幾天。xsl中的屬性與周圍的其他元素排序

我想複製一個xml文件,同時排序嵌套元素的屬性。我已經得到了我覺得應該工作

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:my="my:my"> 
<xsl:output method="xml" indent="yes" /> 
    <xsl:template match="node() | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node() | @*"/> 
    </xsl:copy>  
</xsl:template>   
    <xsl:template match="PrProduct"> 
    <xsl:copy> 
      <xsl:apply-templates select="node()|@* " > 
      <xsl:sort select="@TEC" order="descending" /> 
     </xsl:apply-templates>    
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

繼承人的XML

<body> 
<issueobject> 
<page> 
</page> 
<prproduct TEC="TOR"> 
</prproduct> 
<prproduct TEC="UVA"> 
<partPage> 
</partPage> 
</issueobject> 
</body> 

我認爲問題在於,那裏有關於我的排序爲元素的兩邊在同一水平的元素在玩耍時,我可以得到數據進行排序,但在之前/之前會丟失數據。

感謝

回答

0

什麼樣式表的作用是通過(不存在)TEC屬性值的內容PrProduct元素排序。您需要的是一個匹配父母PrProduct的模板,在您的案例issueobject中,該模板可以對PrProduct元素進行排序。事情是這樣的:

<xsl:template match="issueobject"> 
    <xsl:copy> 
     <xsl:apply-templates select="PrProduct[1]/preceding-sibling::*"/> 
     <xsl:apply-templates select="PrProduct"> 
      <xsl:sort select="@TEC" order="descending"/> 
     </xsl:apply-templates> 
     <xsl:apply-templates select="PrProduct[1]/following-sibling::*[not(self::PrProduct)]"/> 
    </xsl:copy> 
</xsl:template> 

(請注意,此示例忽略的issueobject文本孩子。)

0

您當前模板試圖將prproduct元素的子節點進行排序,找到櫥櫃裸。你可以做的,而不是,是改變模板,只有第一prproduct匹配元素,然後進行排序這一點,下面prproduct兄弟姐妹

<xsl:template match="prproduct[1]"> 
    <xsl:for-each select="self::*|following-sibling::prproduct"> 
     <xsl:sort select="@TEC" order="descending"/> 
     <!-- Copy element --> 
    </xsl:for-each> 
</xsl:template> 

除此之外,所有你需要的是一個模板停止其他prproduct元素被輸出兩次

<xsl:template match="prproduct"/> 

以下是完整的XSLT

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="prproduct[1]"> 
     <xsl:for-each select="self::*|following-sibling::prproduct"> 
     <xsl:sort select="@TEC" order="descending"/> 
     <xsl:call-template name="identity"/> 
     </xsl:for-each> 
    </xsl:template> 

    <xsl:template match="prproduct"/> 
</xsl:stylesheet> 

當適用於您的XML,下面是輸出

<body> 
    <issueobject> 
     <page></page> 
     <prproduct TEC="UVA"></prproduct> 
     <prproduct TEC="TOR"></prproduct> 
     <partPage></partPage> 
    </issueobject> 
</body> 

注意使用命名模板,避免身份模板的重複編碼。