2010-08-05 10 views
2

Je travaille avec Perl et XSL. J'essaie de changer la valeur de <Interval> à un certain nombre dans un fichier XML. Mon XML ressemble à ceci:Pourquoi un élément apparaît-il deux fois après la transformation?

<?xml version="1.0"?> 
<Config> 
    <Enabled>false</Enabled> 
    <Interval>5</Interval> 
</Config> 

Mon XSL ressemble à ceci:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*"/> 
    <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 
    <xsl:template match="/Config/Interval"> 
<xsl:element name="PollingInterval"> 
    <xsl:element name="Interval">77</xsl:element> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

Le problème est que ma sortie a l'élément <Interval> deux fois:

<?xml version="1.0"?> 
<Config> 
    <Enabled>false</Enabled> 
    <Interval><Interval>77</Interval></Interval> 
</Config> 

S'il vous plaît aider.

+0

Bonne question (1). Voir ma réponse pour une explication du problème et une solution complète et simple. –

Répondre

1

Le problème est que ma sortie a l'élément deux fois:

<?xml version="1.0"?> 
<Config> 
    <Enabled>false</Enabled> 
    <Interval><Interval>77</Interval></Interval> 

</Config> 

Pas vrai!

La sortie lorsque cette transformation est appliquée sur le document XML fourni est:

<Config> 
    <Enabled>false</Enabled> 
    <PollingInterval><Interval>77</Interval></PollingInterval> 
</Config> 

Si vous voulez vous débarrasser de l'un élément, il suffit de retirer la <xsl:element> instruction correspondante.

Par exemple: La suppression <xsl:element name="PollingInterval"> la transformation devient:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/Config/Interval"> 
     <xsl:element name="Interval">77</xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

et le résultat de l'application sur le document XML fourni est:

<Config> 
    <Enabled>false</Enabled> 
    <Interval>77</Interval> 
</Config> 

Je recommande de simplifier la transformation supplémentaire et de faire correspondre sur le nœud de texte enfant de Interval.Ceci est peut-être la plus courte et la solution la plus simple:

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

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

    <xsl:template match="Interval/text()"> 
     <xsl:text>77</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

lorsqu'il est appliqué sur le document XML fourni:

<Config> 
    <Enabled>false</Enabled> 
    <Interval>5</Interval> 
</Config> 

le résultat recherché est produit:

<Config> 
    <Enabled>false</Enabled> 
    <Interval>77</Interval> 
</Config> 

En Si vous avez beaucoup d'éléments Interval et que vous voulez eul pour remplacer la valeur par 577 alors le seul modèle à l'exception de la règle d'identité devrait être:

<xsl:template match="Interval/text()[.=5]"> 
    <xsl:text>77</xsl:text> 
</xsl:template> 
+0

Merci.Très utile réponse. – Toren

1

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="Interval/text()">77</xsl:template> 
</xsl:stylesheet> 

Sortie:

<Config> 
    <Enabled>false</Enabled> 
    <Interval>77</Interval> 
</Config> 

Remarque: Si vous postez l'autre échantillon d'entrée et décrire la liaison, nous pouvons vous montrer comment extraire le nouveau numéro.

EDIT: Plus court.

+0

Merci. Bonne réponse. – Toren

Questions connexes