2010-11-10 67 views
26

En tiempo de ejecución que puede tener dos formatos de un archivo XML:¿Cómo comprobar si existe un atributo en un archivo XML utilizando XSL

  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> 
    

Dependiendo de la presencia de el atributo de color tengo que procesar los valores de xaxis y yaxis.

Necesito hacer esto usando XSL. ¿Alguien puede ayudarme a insinuarme un fragmento donde puedo verificar estas condiciones?

He intentado utilizar

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

he obtenido un error ...

+0

¿Qué error obtuvo? –

+0

¿Usó la instrucción 'xsl: choose' :: (' xsl: when' + | 'xsl: otherwise')? –

+0

Sí, utilicé el xsl: elija ... xsl: cuando + xsl: en caso contrario, condiciones en vano ... – srivatsa

Respuesta

1

No entiendo - aparte de su sintaxis ligera inclinación hacia el uso de apply-templates:

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

No hay mucho que podamos contarte sin saber lo que realmente quieres hacer.

+0

solo quiero procesar el gráfico en función de la presencia del atributo "color" en el archivo xml ... – srivatsa

+0

es como si (¿el atributo está presente?) Proceso 1; else proceso 2; – srivatsa

+0

También este gráfico [1] [@ color] no reconoce la presencia del atributo – srivatsa

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

voy a hacer una conjetura aquí, ya que su pregunta no se encuentra una gran cantidad de información importante, como el contexto en el que aparece Thie <xsl:when.... Si su comentario es correcto, lo que quiere hacer es procesar graph[1]/xaxis y .../yaxis, no graph[1]/@color valores.

+0

Sí. Por ej. basado en la existencia del atributo "color", necesito establecer una variable say..graph-color. Ahora quiero una declaración simple if-else basada en si el atributo está presente o no. Si es cierto..entonces puedo establecer una variable tal como figura en el atributo. De lo contrario, puedo usar un color predeterminado –

+0

Edite su publicación para incluir más de su hoja de estilo para que podamos descubrir lo que está tratando de lograr. –

30

Aquí es una manera muy simple de hacer el procesamiento condicional utilizando toda la potencia de XSLT coincidencia de patrones y exclusivamente estilo "empuje", y esto incluso evita la necesidad de utilizar instrucciones condicionales como <xsl:if> o <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> 

cuando se aplica esta transformación en el siguiente documento XML:

<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 1</xaxis> 
      <yaxis>101 102 103 1012 10312 103123 1</yaxis> 
     </graph> 
    </diagram> 
</root> 

el, resultado correcto querido se produce:

Graph[1] has color 

cuando se aplica la misma transformación en este documento XML:

<root> 
    <diagram> 
     <graph> 
      <xaxis>101 102 103 1012 10312 103123 1</xaxis> 
      <yaxis>101 102 103 1012 10312 103123 1</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> 

vez más la quería y resultado correcto se produce:

Graph[1] has not color 

Se puede personalizar esta solución y colocar el código necesario dentro de la primera plantilla y, si es necesario, dentro de la segunda plantilla.

+1

+1 para el estilo XSLT. – Flack

+0

@Dimitre Novatchev ¿Es posible usar esta solución en las instrucciones de ? Estoy generando código de XML con XSLT, y me gustaría filtrar algunos getter y setter? – chepseskaf

+0

@chepseskaf: Si quiere decir que es posible usar los predicados en el atributo 'select' de' xsl: apply-templates' en lugar de tenerlos en los patrones de coincidencia, la respuesta es positiva, pero al hacerlo no es necesario y conduce a un estilo de procesamiento más "push" o imperativo, lo que disminuye la simplicidad, comprensibilidad, facilidad de mantenimiento y optimizabilidad. –

16

personalizar la plantilla en un partido como este

<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>** 
+0

Útil en funciones xsl – Charles

+0

Gracias por su respuesta, funcionó para mí. –

Cuestiones relacionadas