2010-01-27 4 views
1

J'ai un XML où un nœud de texte avec la valeur "null tag" apparaît (aléatoirement) aux différents endroits dans le fichier.
Ma question est comment pour remplacer le texte avec un autre texte, où le nom de l'élément (et le parent parent) est inconnu. J'ai déjà créé un fichier XSLT qui a l'air un peu volumineux et je ne suis pas sûr de son efficacité dans le temps de transformation.

C'est le XML de test d'échantillon que j'ai créé:Code efficace pour remplacer un nœud de texte par un autre texte en utilisant XSLT?

<root> 
    <sub_root>abc</sub_root> 
    <sub_root> 
    <child>test value</child> 
    <child2>test value</child2> 
    <sub_child> 
     <node1>data</node1> 
     <node2>data2</node2> 
     <node3> 
     <grand_child>test value</grand_child> 
     </node3> 
     <node4>test value</node4> 
    </sub_child> 
    </sub_root> 
</root> 

C'est le XSLT:

<xsl:template match="@*|*|text()"> 
     <xsl:copy> 
      <xsl:choose> 
      <xsl:when test="text()='test value'"> 
       <xsl:apply-templates select="@*|*"/> 
       <xsl:text>replaced</xsl:text> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:apply-templates select="@*|*|text()"/> 
      </xsl:otherwise> 
      </xsl:choose> 
     </xsl:copy> 
    </xsl:template> 

C'est la sortie désirée, je suis en train de générer:

<root> 
    <sub_root>abc</sub_root> 
    <sub_root> 
    <child>replaced</child> 
    <child2>replaced</child2> 
    <sub_child> 
     <node1>data</node1> 
     <node2>data2</node2> 
     <node3> 
     <grand_child>replaced</grand_child> 
     </node3> 
     <node4>replaced</node4> 
    </sub_child> 
    </sub_root> 
</root> 

ce code peut-il être écrit d'une manière encore meilleure (dans tous les termes)? Ou est-ce que mon code est meilleur?

Répondre

5

ajouter ceci à l'identité transform:

<xsl:template match="text()[. = 'test value']"> 
    <xsl:text>replaced</xsl:text> 
</xsl:template> 

Le résultat copiera chaque nœud dans l'entrée, non modifié, à la sortie - à l'exception des noeuds de texte dont la valeur est test value, qui sera transformé en nœuds de texte avec la valeur replaced.

+1

yup cela réduit l'abstraction dans mon code .. :-) thanx .. –

Questions connexes