2016-08-24 18 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>