2016-08-24 15 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、またはそれを変換するためにlittel Programm(Javaなど)を使用する必要がありますか?

ありがとうございます!

+0

なぜ出力はまだ持っていないXSLT 1.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処理命令を持っていないと仮定し、しかし、あなたは

<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> 
関連する問題