2016-08-24 34 views
0

是否有可能根據處理指令設置屬性?我們使用XLST 1.0和我有下面的XML文件:XSLT - 根據處理指令設置屬性

<body> 
    <div> 
     Text 
    </div> 
    <div> 
     <?class-start type="blue" ?> 
     <span> 
      <div>   
       Text1 
      </div> 
     </span> 
     <?class-end type="blue" ?> 
    </div> 

    <div> 
     <?class-start type="green" ?> 
     <span> 
      <div> 
       <?class-end type="green" ?> 
       Text2 
      </div> 
     </span>   
    </div> 


    <div>  
     <span> 
      <?class-start type="red" ?> 
      <div>    
       Text3 
      </div> 
      <div>   
       Text4 
      </div> 
      <div>    
       Text5 
      </div> 
      <div>    
       Text6 
      </div> 
      <?class-end type="red" ?> 
     </span> 
    </div> 
</body> 

,我想將它轉換爲下面的XML文件:

<body> 
    <div> 
     Text 
    </div> 
    <div> 
     <span class="blue"> 
      <div class="blue">   
       Text1 
      </div> 
     </span> 
    </div> 

    <div> 
     <?class-start type="green" ?> 
     <span class="green"> 
      <?class-end type="green" ?> 
      <div>   
       Text2 
      </div> 
     </span>  
    </div> 


    <div> 
     <span> 
      <div class="red"> 

       Text3 
      </div> 
      <div class="red"> 

       Text4 
      </div> 
      <div class="red"> 

       Text5 
      </div> 
      <div class="red"> 

       Text6 
      </div> 
     </span> 
    </div> 
</body> 

是否有可能使用XSLT轉換會這樣1.0,還是應該使用一個小程序(Java或其他)來轉換它?

謝謝!

+0

爲何輸出還是有實現這個'<?class-start type =「green」?>'?正如你提到的「一個小程序」和Java,爲什麼在Saxon 9提供XSLT 2.0和3.0的Java世界中,你僅限於XSLT 1.0? –

+0

我想使用XSLT 1.0,但是如果沒有機會在XSLT 1.0中執行此操作,那麼必須使用Java或其他語言編寫程序。由於許可我無法使用撒克遜。 – archos

回答

1

這不是很有效,而且還假定您不必過度研磨class-startclass-end處理指令,但在這裏是一種方式,你可以在XSLT 1.0

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

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

    <xsl:template match="*[count(preceding::processing-instruction('class-start')) = count(preceding::processing-instruction('class-end')) + 1]"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*" /> 
      <xsl:attribute name="class"> 
       <xsl:value-of select="normalize-space(translate(substring-after(preceding::processing-instruction('class-start')[1], '='), '&quot;', ''))" /> 
      </xsl:attribute> 
      <xsl:apply-templates select="node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="processing-instruction('class-start')|processing-instruction('class-end')" /> 
</xsl:stylesheet>