2014-09-23 10 views
5

Ben aşağıdaki XML kaynağını var: Ben belirli nitelikleri aracılığıyla döngü (ı inşa ediyorum HTML ile ilgili yani sadece olanlara herhangi amacıylaYapı XML yapısı

<element not-relevant="true" bold="true" superscript="true" subscript="false" text="stuff"/> 

gerek : kalın/üst/alt simge, vb) ve bu özelliklerin biri aşağıdaki çıktıyı almak için 'gerçek', çıktı yuvalanmış elemanları olarak değerlendirilirse burada: içimde bir ses

<strong> 
    <sup> 
     stuff 
    </sup> 
</strong> 

ben özyineleme çeşit kullanmak gerekir aşağıdaki gibi (sonsuz döngü olmadan):

<xsl:template match="element"> 
    <xsl:call-template name="content"> 
     <xsl:with-param name="text" select="@text"/> 
    </xsl:call-template> 
</xsl:template> 

<xsl:template name="content"> 
    <xsl:param name="text"/> 
    <xsl:choose> 
     <xsl:when test="@bold = 'true'"> 
      <strong> 
       <xsl:copy> 
        <xsl:call-template name="content"> 
         <xsl:with-param name="text" select="$text"/> 
        </xsl:call-template> 
       <xsl:copy> 
      </strong> 
     </xsl:when> 
     <xsl:when test="@subscript = 'true'"> 
      <sub> 
       <xsl:copy> 
        <xsl:call-template name="content"> 
         <xsl:with-param name="text" select="$text"/> 
        </xsl:call-template> 
       <xsl:copy> 
      </sub> 
     </xsl:when> 
     <xsl:when test="@superscript = 'true'"> 
      <sup> 
       <xsl:copy> 
        <xsl:call-template name="content"> 
         <xsl:with-param name="text" select="$text"/> 
        </xsl:call-template> 
       <xsl:copy> 
      </sup> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="$text" disable-output-escaping="yes"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

Herhangi bir fikir? En temiz XSLT 2.0 çözümünü arıyorum ve yardımı takdir ediyorum. Bu <xsl:next-match/> için güzel bir kullanım durumu

cevap

6

sayesinde: Bir element elemana şablonları uyguladığınızda

<xsl:template match="element" priority="1"> 
    <xsl:value-of select="@text" /> 
</xsl:template> 

<xsl:template match="element[@superscript = 'true']" priority="2"> 
    <sup><xsl:next-match/></sup> 
</xsl:template> 

<xsl:template match="element[@subscript = 'true']" priority="3"> 
    <sub><xsl:next-match/></sub> 
</xsl:template> 

<xsl:template match="element[@bold = 'true']" priority="4"> 
    <strong><xsl:next-match/></strong> 
</xsl:template> 

ilk en yüksek öncelik eşleşen şablonu ateş ve edeceğiz şablon kullanımları eğer next-match bir sonraki en yüksek önceliğe delege eder. Sorunuzdaki ilk element örneğiniz yukarıdaki birinci, ikinci ve dördüncü şablonlarla eşleşir, bu nedenle başlangıçta "kalın" şablon seçilecektir, daha sonra bu "üst simge" ye delege edilecek ve nihayet jenere element one, <strong><sup>stuff</sup></strong> ile sonuçlanır.

Bu örnekten de görebileceğiniz gibi, öncelik sıralaması yuvalama sırasını belirler. İkinci ve dördüncü şablonların öncelikleri tersine çevrilirse, bunun yerine <sup><strong>stuff</strong></sup> elde edersiniz.

+0

Bunu hiç bilmiyordum - harika çözüm. Teşekkürler! – Aaron