web-dev-qa-db-fra.com

Comment vérifier si un attribut existe dans un fichier XML à l'aide de XSL

Au moment de l'exécution, je peux avoir deux formats d'un fichier XML:

  1. <root>
        <diagram> 
            <graph color= "#ff00ff">    
                <xaxis>1 2 3 12 312 3123 1231 23 </xaxis>
                <yaxis>1 2 3 12 312 3123 1231 23 </yaxis>
            </graph>  
        </diagram> 
    </root>
    
  2. <root>
        <diagram> 
            <graph>    
                <xaxis>1 2 3 12 312 3123 1231 23 </xaxis>
                <yaxis>1 2 3 12 312 3123 1231 23 </yaxis>
            </graph>  
        </diagram> 
    </root>
    

En fonction de la présence de l'attribut color, je dois traiter les valeurs de xaxis et yaxis.

Je dois le faire en utilisant XSL. Quelqu'un peut-il m'aider en me faisant un extrait où je peux vérifier ces conditions.

J'ai essayé d'utiliser

<xsl: when test="graph[1]/@color">
     //some processing here using graph[1]/@color values
</xsl:when>

j'ai une erreur ...

27
srivatsa

Voici un moyen très simple de faire un traitement conditionnel en utilisant toute la puissance de la correspondance de modèles XSLT et exclusivement du style "Push", et cela évite même d'avoir à utiliser des instructions conditionnelles telles que <xsl:if> ou <xsl:choose>:

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

 <xsl:template match="/root/diagram[graph[1]/@color]">
  Graph[1] has color
 </xsl:template>

 <xsl:template match="/root/diagram[not(graph[1]/@color)]">
  Graph[1] has not color
 </xsl:template>
</xsl:stylesheet>

lorsque cette transformation est appliquée sur le document XML suivant:

<root>
    <diagram>
        <graph color= "#ff00ff">
            <xaxis>1 2 3 12 312 3123 1231 23 </xaxis>
            <yaxis>1 2 3 12 312 3123 1231 23 </yaxis>
        </graph>
        <graph>
            <xaxis>101 102 103 1012 10312 103123 101231 1023 </xaxis>
            <yaxis>101 102 103 1012 10312 103123 101231 1023 </yaxis>
        </graph>
    </diagram>
</root>

le résultat voulu et correct est produit:

  Graph[1] has color

lorsque la même transformation est appliquée sur ce document XML:

<root>
    <diagram>
        <graph>
            <xaxis>101 102 103 1012 10312 103123 101231 1023 </xaxis>
            <yaxis>101 102 103 1012 10312 103123 101231 1023 </yaxis>
        </graph>
        <graph color= "#ff00ff">
            <xaxis>1 2 3 12 312 3123 1231 23 </xaxis>
            <yaxis>1 2 3 12 312 3123 1231 23 </yaxis>
        </graph>
    </diagram>
</root>

encore une fois le résultat voulu et correct est produit:

  Graph[1] has not color

On peut personnaliser cette solution et mettre tout le code nécessaire à l'intérieur du premier modèle et si nécessaire, à l'intérieur du deuxième modèle.

32
Dimitre Novatchev

Personnalisez le modèle en une seule correspondance comme celle-ci

<xsl:template match="diagram/graph">
  <xsl:choose>
    <xsl:when test="@color">
         Do the Task
    </xsl:when>
    <xsl:otherwise>
         Do the Task
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>**
17
vignesh
<xsl:when test="graph[1]/@color">
     //some processing here using graph[1]/@color values
</xsl:when>

Je vais faire une supposition ici, car votre question manque de nombreuses informations importantes, telles que le contexte dans lequel _<xsl:when... apparaît. Si votre commentaire est correct, ce que vous voulez faire est de traiter graph[1]/xaxis et .../yaxis, ne pas graph[1]/@color valeurs.

4
Jim Garrison

Je ne comprends pas - à part une légère syntaxe Tweak vers l'utilisation de modèles d'application:

<xsl:template match="graph[1][@color]">
  <!-- your processing here -->
</xsl:template>

Il n'y a pas grand-chose que nous pouvons vous dire sans savoir ce que vous voulez réellement faire.

1
annakata