2010-10-12 22 views
5

es posible omitir nodos al procesar un archivo xml. por ejemplo, decir que tengo el siguiente código XMLomitir nodos con XSLT

<mycase desc=""> 
    <caseid> id_1234 </caseid> 
    <serid ref=""/>  
    ...... 
    ...... 
    ...... 
</mycase> 

y quiero que se vea como este

<mycase desc="" caseid="id_1234"> 
..... 
..... 
</mycase> 

Actualmente estoy haciendo esto

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:stylesheet version="2.0" exclude-result-prefixes="xs xdt err fn" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:fn="http://www.w3.org/2005/xpath-functions" 
      xmlns:xdt="http://www.w3.org/2005/xpath-datatypes" 
      xmlns:err="http://www.w3.org/2005/xqt-errors"> 

      <xsl:output method="xml" indent="yes"/> 
      <xsl:template match="/"> 
      <xsl:apply-templates/> 
      </xsl:template> 

     <xsl:template match="mycase">   
      <xsl:element name="mycase"> 
       <xsl:attribute name="desc"/> 
       <xsl:attribute name="caseid"> 
       <xsl:value-of select="caseid"/> 
       </xsl:attribute> 
       <xsl:apply-templates/> 
      </xsl:element> 
     </xsl:template> 
     ...... 
     ...... 

Esto crea lo que yo lo quiere pero debido a

<xsl:apply-template/> 

procesa todo el nodo. mientras que quiero que salte el procesamiento de caseid y serid todos juntos. Esto también se aplica a otros nodos, que no estarán disponibles en la nueva estructura XML. Entonces, ¿cómo puedo omitir los nodos que no quiero procesar usando xslt.

cordiales, Ehsan

Respuesta

8

puede utilizar plantillas vacías para suprimir la producción de ciertos nodos en el documento de entrada:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="mycase"> 
    <mycase caseid="{caseid}"> 
     <xsl:apply-templates select="@*|node()"/> 
    </mycase> 
    </xsl:template> 

    <xsl:template match="caseid|serid"/> 

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

</xsl:stylesheet> 
+0

+1 Buena respuesta. –

2

uso <xsl:apply-templates select="mycase"/> en lugar de <xsl:apply-templates />

Básicamente, lo que hay que hacer es aplicar las plantillas de sólo un conjunto de nodos específicos. En tu caso solo los nodos 'mycase'.

4

Tal vez la forma más sencilla de hacer esto, es añadir una plantilla que coincide caseid, y hacer que haga nada, de esta manera:

<xsl:template match="caseid"/> 

al añadir esto a su XSL existente, el elemento caseid se ignora.

Otra solución sería utilizar sólo xsl:apply-elements en elementos que no coincidan con el nombre caseid, es decir .:

<xsl:template match="mycase">   
     <xsl:element name="mycase"> 
      <xsl:attribute name="desc"/> 
      <xsl:attribute name="caseid"> 
      <xsl:value-of select="caseid"/> 
      </xsl:attribute> 
      <xsl:apply-templates select="*[name() != 'caseid']"/> 
     </xsl:element> 
</xsl:template> 

Espero que esto ayude, buena suerte!

Cuestiones relacionadas