2014-01-29 82 views
0

我試圖將所有<list>元素包裝在<div>中。 <list>元素都是彼此的兄弟姐妹。我認爲匹配第一個元素並將模板應用於所有它和它的所有兄弟在<div>內就足夠了,但我似乎在這裏丟失了一些東西。XSLT 1.0將第一個元素和所有後續的同級元素包裝

我有下面的XML:

<section.body> 
    <para> 
     <list> 
      ... 
     </list> 
     <list> 
      ... 
     </list> 
     <list> 
      ... 
     </list> 
    </para> 
</section.body> 

而下面的XSLT:

<xsl:template match="section.body/para/list[1]"> 
    <div> 
     <xsl:attribute name="class"> 
      <xsl:value-of select="'&listWrapperClass;'"/> 
     </xsl:attribute> 

     <xsl:apply-templates select=".|following-sibling::list"/> 
    </div> 
</xsl:template> 

隨着預期的效果:

<div class="sectionClass"> 
    <div class="paraClass"> 
     <div class="listWrapperClass"> 
      <div class="listClass"/> 
      <div class="listClass"/> 
      <div class="listClass"/> 
      <div class="listClass"/> 
     </div> 
    </div> 
</div> 

這似乎在一個循環中被抓到的時候試圖應用這些模板,並對我進行嘲弄。真的不知道我在這裏錯過了什麼,所以任何幫助將不勝感激!

回答

0

這個樣式表

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:strip-space elements="*"/> 

    <xsl:template match="section.body"> 
     <div class="sectionClass"> 
      <xsl:apply-templates/> 
     </div> 
    </xsl:template> 

    <xsl:template match="section.body/para"> 
     <div class="paraClass"> 
      <xsl:apply-templates/> 
     </div> 
    </xsl:template> 


    <xsl:template match="section.body/para/list[1]"> 
     <div> 
      <xsl:attribute name="class"> 
       <xsl:value-of select="'listWrapperClass'"/> 
      </xsl:attribute> 
      <div class="listClass"> 
       <xsl:apply-templates/> 
      </div> 
      <xsl:apply-templates select="following-sibling::list" mode="group"/> 
     </div> 
    </xsl:template> 

    <xsl:template match="section.body/para/list[position()!=1]"/> 

    <xsl:template match="section.body/para/list[position()!=1]" mode="group"> 
     <div> 
      <xsl:attribute name="class"> 
       <xsl:value-of select="'listClass'"/> 
      </xsl:attribute> 
      <xsl:apply-templates/> 
     </div> 
    </xsl:template> 
</xsl:stylesheet> 

當應用到你的XML輸入,產生:

<?xml version="1.0" encoding="utf-8"?> 
<div class="sectionClass"> 
    <div class="paraClass"> 
     <div class="listWrapperClass"> 
      <div class="listClass"> ... </div> 
      <div class="listClass"> ... </div> 
      <div class="listClass"> ... </div> 
     </div> 
    </div> 
</div> 
+0

完美!那正是我需要的。我對XSLT相當陌生,這表明我對一些我不瞭解的東西有正確的方向。謝謝! – Anthony

相關問題