2009-10-31 19 views
0

Y at-il pour remplacer saxon:if et saxon:before fonctions XSLT 2.0/XPath 2.0?remplacement pour Saxonne: si et Saxonne: avant que les fonctions dans xslt 2.0

je code comme ceci:

<xsl:variable name="stop" 
    select="(following-sibling::h:h1|following-sibling::h:h2)[1]" /> 

<xsl:variable name="between" 
    select="saxon:if($stop, 
        saxon:before(following-sibling::*, $stop), 
        following-sibling::*)" /> 

idée est que la variable between doit contenir tous les éléments entre le nœud courant et l'élément suivant h1 ou h2 (stockée dans la variable stop), ou tous les éléments restants, s'il y a pas de h1 ou h2 suivant.

Je voudrais utiliser ce code dans le nouveau modèle XSLT 2.0, et je suis à la recherche de remplacement pour saxon:if et saxon:before.

Répondre

0

Voici ma solution:

<xsl:variable 
    name="stop" 
    select="(following-sibling::h:h1|following-sibling::h:h2)[1]" /> 

<xsl:variable name="between"> 
    <xsl:choose> 
     <xsl:when test="$stop"> 
      <xsl:sequence select="following-sibling::*[. &lt;&lt; $stop]" /> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:sequence select="following-sibling::*" /> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

Il utilise <xsl:sequence> et << operator (codé comme &lt;&lt;), à partir de XSLT 2.0/XPath 2.0.

Ce n'est pas aussi court que la version originale, mais il n'utilise plus les extensions saxon.

1

saxon.if(A, B, C) est maintenant équivalent à if (A) then B else C dans XPath 2.0

+0

+1 Bonne réponse. –

0

Vous pourriez également utiliser une seule expression dans XSLT/XPath 2.0:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="text()"/> 
    <xsl:template match="p[position()=(1,3,4)]"> 
     <xsl:copy-of select="following-sibling::* 
           [not(self::h2|self::h1)] 
           [not(. >> 
            current() 
             /following-sibling::* 
              [self::h2|self::h1][1])]"/> 
    </xsl:template> 
</xsl:stylesheet> 

Avec cette entrée:

<html> 
    <p>1</p> 
    <p>2</p> 
    <h2>Header</h2> 
    <p>3</p> 
    <h1>Header</h1> 
    <p>4</p> 
    <p>5</p> 
</html> 

sortie:

<p>2</p><p>5</p>