2010-05-25 9 views
1

J'ai un problème majeur pour trouver un moyen d'ajouter un espace entre deux éléments enfants.Comment ajouter un espace quand un certain motif est trouvé?

<aaa> 
    I want to add <bbb>a</bbb><ccc>space</ccc> between two words. 
</aaa> 

Je veux ajouter un espace entre les « mots » et un « espace » si l'élément ccc suit l'élément bbb immédiatement. Actuellement, j'applique un modèle au niveau de l'élément aaa, puis je gère les éléments bbb et ccc dans des modèles distincts.

Je ne sais pas comment détecter ce motif </bbb><ccc> à l'avance.

Note: Je ne sais pas quels mots seront dans les éléments bbb et ccc.

Répondre

2

Cette transformation:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes"/> 

<xsl:template match="node()|@*" name="identity"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match= 
    "b[. = 'a' 
    and 
    following-sibling::node() 
        [1] 
        [self::i 
        and 
        . = 'boy' 
        ] 
     ] 
    "> 
    <xsl:call-template name="identity"/> 
    <xsl:text> </xsl:text> 
</xsl:template> 
</xsl:stylesheet> 

lorsqu'elle est effectuée sur le document XML fourni:

<aaa> 
    I am <b>a</b><i>boy</i>. 
</aaa> 

produit le résultat souhaité, correct:

<aaa> 
    I am <b>a</b> <i>boy</i>. 
</aaa> 

Prenez note:

  1. L'utilisation de la règle d'identité pour copier tous les nœuds.

  2. Remplacement de la règle d'identité par un modèle spécifique pour effectuer l'ajout du caractère d'espace exactement entre les noeuds <b> et <i> spécifiés.

  3. Motif de correspondance (expression XPath) utilisé pour correspondre exactement au noeud <b> souhaité après lequel l'espace doit être inséré.

  4. Réutilisation du code de la règle de modèle, les deux étant appliqués et appelés par nom.

+1

+1, agréable. Pour une version plus générale pour ajouter un espace entre les éléments adjacents à l'intérieur d'un élément 'aaa', l'expression de correspondance de ce dernier modèle pourrait être écrite comme' aaa/* [following-sibling :: node() [1]/self: : *] ' –

Questions connexes