2012-10-29 165 views
0

XSLT XML問題。第一個最後一個元素第二個變體

我有我以前的問題的另一種變化。我必須輸出每個部分的第一個和最後一個頁面元素。如下所示。

XSLT 1.0解決方案和XSLT 2.0解決方案將不勝感激。我提前感謝您的時間和幫助。

謝謝JJ。

輸入:

<root> 
    <page number="1" section="Arsenal">Arsenal</page> 
    <page number="2" section="Arsenal">Arsenal</page> 
    <page number="3" section="Arsenal">Arsenal</page> 
    <page number="4" section="Arsenal">Arsenal</page> 
    <page number="5" section="Arsenal">Arsenal</page> 
    <page number="6" section="Arsenal">Arsenal</page> 
    <page number="7" section="Chelsea">Chelsea</page> 
    <page number="8" section="Chelsea">Chelsea</page> 
    <page number="9" section="Chelsea">Chelsea</page> 
    <page number="10" section="Chelsea">Chelsea</page> 
    <page number="11" section="Chelsea">Chelsea</page> 
    <page number="12" section="Chelsea">Chelsea</page> 
    <page number="13" section="ManUnited">ManUnited</page> 
    <page number="14" section="ManUnited">ManUnited</page> 
    <page number="15" section="ManUnited">ManUnited</page> 
    <page number="16" section="ManUnited">ManUnited</page> 
    <page number="17" section="ManUnited">ManUnited</page> 
    <page number="18" section="ManUnited">ManUnited</page> 
    <page number="19" section="ManCity">ManCity</page> 
    <page number="20" section="ManCity">ManCity</page> 
    <page number="21" section="ManCity">ManCity</page> 
    <page number="22" section="ManCity">ManCity</page> 
    <page number="23" section="ManCity">ManCity</page> 
    <page number="24" section="ManCity">ManCity</page> 
    <page number="25" section="Arsenal">Arsenal</page> 
    <page number="26" section="Arsenal">Arsenal</page> 
    <page number="27" section="Arsenal">Arsenal</page> 
    <page number="28" section="Arsenal">Arsenal</page> 
    <page number="29" section="Arsenal">Arsenal</page> 
</root> 

輸出:

<root> 
    <page number="1" section="Arsenal">Arsenal</page> 
    <page number="6" section="Arsenal">Arsenal</page> 
    <page number="7" section="Chelsea">Chelsea</page> 
    <page number="12" section="Chelsea">Chelsea</page> 
    <page number="13" section="ManUnited">ManUnited</page> 
    <page number="18" section="ManUnited">ManUnited</page> 
    <page number="19" section="ManCity">ManCity</page> 
    <page number="24" section="ManCity">ManCity</page> 
    <page number="25" section="Arsenal">Arsenal</page> 
    <page number="29" section="Arsenal">Arsenal</page> 
</root> 
+0

你好。如果你要參考前一個問題,你至少需要提供一個鏈接到這個問題!理想情況下,所有問題都應該是自包含的,以避免點擊進入其他頁面。謝謝! –

回答

3

的一種方式,這將在兩個工作XSLT1.0和2.0是僅僅有一個模板都將匹配有頁面元素同樣的@section屬性作爲最先前和最後的兄弟姐妹

<xsl:template match="page 
    [@section = preceding-sibling::page[1]/@section] 
    [@section = following-sibling::page[1]/@section]" /> 

以下是完整的XSLT

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

    <xsl:template match="page[@section = preceding-sibling::page[1]/@section][@section = following-sibling::page[1]/@section]" /> 

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

當應用到輸入XML,下面是輸出

<root> 
    <page number="1" section="Arsenal">Arsenal</page> 
    <page number="6" section="Arsenal">Arsenal</page> 
    <page number="7" section="Chelsea">Chelsea</page> 
    <page number="12" section="Chelsea">Chelsea</page> 
    <page number="13" section="ManUnited">ManUnited</page> 
    <page number="18" section="ManUnited">ManUnited</page> 
    <page number="19" section="ManCity">ManCity</page> 
    <page number="24" section="ManCity">ManCity</page> 
    <page number="25" section="Arsenal">Arsenal</page> 
    <page number="29" section="Arsenal">Arsenal</page> 
</root> 

在XSLT2.0只有不過,你可以利用的xsl:爲 - 每組組相鄰的屬性。

這XSLT也應該產生相同的輸出

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

    <xsl:template match="root"> 
     <xsl:for-each-group select="page" group-adjacent="@section"> 
     <xsl:apply-templates select="current-group()[1]|current-group()[last()]"/> 
     </xsl:for-each-group> 
    </xsl:template> 

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

非常感謝您的解決方案... –

相關問題