2010-08-25 4 views
0

J'ai élaboré un modèle XSL qui réécrit tous les hyperliens sur une page HTML, contenant une certaine sous-chaîne dans l'attribut href. Il ressemble à ceci:Réécriture d'hyperliens XSL sans recréer l'élément

<xsl:template match="A[contains(@href, 'asp')]"> 
    <a> 
     <xsl:attribute name="href"> 
      <xsl:value-of select="bridge:linkFrom($bridge, $base, @href, 'intranet')" /> 
     </xsl:attribute> 
     <xsl:apply-templates select="node()" /> 
    </a> 
</xsl:template> 

Je ne suis pas aimer le fait que je dois recréer l'un des éléments à partir de zéro. Je sais que vous pouvez faire quelque chose comme ceci:

<xsl:template match="A/@href"> 
    <xsl:attribute name="href"> 
     <xsl:value-of select="bridge:linkFrom($bridge, $base, ., 'intranet')" /> 
    </xsl:attribute> 
</xsl:template> 

Mais comment est-ce que je devrais fusionner ces deux ensemble? J'ai essayé f.e. ceci et cela ne fonctionne pas (l'élément n'est pas sélectionné):

<xsl:template match="A[contains(@href, 'asp')]/@href"> 
    <xsl:attribute name="href"> 
     <xsl:value-of select="bridge:linkFrom($bridge, $base, ., 'intranet')" /> 
    </xsl:attribute> 
</xsl:template> 

Toute aide est très appréciée!

Répondre

2

Première: Si vous déclarez une règle pour faire correspondre un attribut, vous devez prendre soin de appliquer des modèles à ces attributs, parce qu'il n'y a pas de règle intégrée à le faire et d'appliquer des modèles sans sélectionner est le même que apply-templates select="node()".

Ainsi, cette feuille de style:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="a/@href[.='#']"> 
     <xsl:attribute name="href">http://example.org</xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

Avec cette entrée:

<root> 
    <a href="#">link</a> 
</root> 

Sortie:

<root> 
    <a href="http://example.org">link</a> 
</root> 

Mais, cette feuille de style:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="a/@href[.='#']"> 
     <xsl:attribute name="href">http://example.org</xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

Sortie:

<root> 
    <a>link</a> 
</root> 
+0

+1 pour une bonne réponse. –

+0

Merci, cela a fait l'affaire! –

+0

@limburgie: Vous êtes bienvenu! –

0

Je m'attendrais aussi à ce que cela fonctionne. Je n'ai aucun moyen de tester cela maintenant, mais avez-vous essayé de l'écrire autrement? Par exemple:

<xsl:template match="A/@href[contains(. , 'asp')]"> 
+0

Ne semble pas fonctionner non plus ... Merci d'avoir essayé. –

Questions connexes