2009-11-17 8 views
2

dans mes éléments de fichier XML ne sont pas constantes dire que mon fichier estMaintenir tous les éléments XML dans le fichier xml

<alpha> 
    <a>...</a> 
    <b>...</b> 
    <c>...</c> 
</alpha> 
<alpha> 
    <a>...</a> 
    <c>...</c> 
</alpha> 
<alpha> 
    <a>...</a> 
    <b>...</b> 
</alpha> 
<alpha> 
    <a>...</a> 
    <b>...</b> 
    <c>...</c> 
</alpha> 

Je voulais dire que je veux maintenir tous les éléments dans mon fichier xml en créant l'élément non existant dans l'ensemble et devrait sauter si l'un des éléments existe en utilisant xslt. Pls. aide-moi à résoudre ce problème.

Vous voulez OutPut Comme ci-dessous pour les éléments non existants avec la valeur 0 en créant en xslt.

**

<alpha> 
     <a>...</a> 
     <b>...</b> 
     <c>...</c> 
    </alpha> 
    <alpha> 
     <a>...</a> 
     <b>0</b> 
     <c>...</c> 
    </alpha> 
    <alpha> 
     <a>...</a> 
     <b>...</b> 
     <c>0</c> 
    </alpha> 
    <alpha> 
     <a>...</a> 
     <b>...</b> 
     <c>...</c> 
    </alpha> 

**

+2

vous devez surligner votre XML et ensuite utiliser le bouton "code" (010 101) dans la barre d'outils de l'éditeur pour obtenir des résultats utiles! –

+0

et que voulez-vous faire avec ce XML et XSLT? Convertir en un XML qui a tous les éléments pour tous les nœuds ? –

+0

Je ne comprends pas ce dont vous avez besoin, pouvez-vous fournir un petit exemple (ie avec moins de 5 tags) de l'entrée et la sortie que vous attendez/voulez – RageZ

Répondre

1

XSLT 2,0

<xsl:template match="a|b|c"> 
     <xsl:copy-of select="."/> 
    </xsl:template> 
    <xsl:template match="alpha"> 
     <xsl:variable name="alpha" select="."/> 
     <xsl:variable name="forced"> 
      <forced> 
       <a>0</a> 
       <b>0</b> 
       <c>0</c> 
      </forced> 
     </xsl:variable> 
     <xsl:copy> 
      <xsl:for-each select="$forced/forced/*"> 
       <xsl:variable name="current" select="name()"/> 
       <xsl:choose> 
        <xsl:when test="exists($alpha/*[name() = $current])"> 
         <xsl:apply-templates select="$alpha/*[name() = $current]"/> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:apply-templates select="$forced/forced/*[name() = $current]"/> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:for-each> 
     </xsl:copy> 
    </xsl:template> 

XSLT 1,0

<xsl:template match="/root"> 
    <root> 
     <xsl:for-each select="alpha"> 
       <alpha> 
       <xsl:choose> 
        <xsl:when test="a"> 
         <xsl:copy-of select="a"/> 
        </xsl:when> 
        <xsl:otherwise> 
         <a>0</a> 
        </xsl:otherwise> 
       </xsl:choose> 
       <xsl:choose> 
        <xsl:when test="b"> 
         <xsl:copy-of select="b"/> 
        </xsl:when> 
        <xsl:otherwise> 
         <b>0</b> 
        </xsl:otherwise> 
       </xsl:choose> 
       <xsl:choose> 
        <xsl:when test="c"> 
         <xsl:copy-of select="c"/> 
        </xsl:when> 
        <xsl:otherwise> 
         <c>0</c> 
        </xsl:otherwise> 
       </xsl:choose> 
       </alpha> 
      </xsl:for-each> 
    </root> 
</xsl:template> 
+0

Cela ne marchera pas avec XSLT 1.0; votre variable $ forced est un RTF (Result Tree Fragment), et vous ne pouvez pas utiliser RTF dans une expression XPath. – Erlock

+0

Très bien, j'ai aussi ajouté un template 1.0. Pas que je l'aime beaucoup. J'utilise toujours saxon pour le traitement et 2.0 est tellement mieux. –

+0

Merci beaucoup, j'ai eu la solution. – naidu

1

Une simple transformation identitaire légèrement modifié peut le faire:

<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:if test="self::alpha"> 
     <xsl:if test="not(a)"><a>0</a></xsl:if> 
     <xsl:if test="not(b)"><b>0</b></xsl:if> 
     <xsl:if test="not(c)"><c>0</c></xsl:if> 
     </xsl:if> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Notez que le modèle ci-dessus ne crée pas les a, b, éléments c dans cet ordre (puisque je ne pense pas que ce soit vraiment nécessaire) . Il s'assure simplement que tous les trois sont présents et copie le reste de l'entrée telle quelle.

Questions connexes