2010-06-25 21 views
11

Soy nuevo en xslt. Tengo el siguiente problema. Necesito dentro de un xml, para eliminar un atributo específico (theAttribute en el ejemplo) de un elemento específico (por ejemplo, div). es decirExcluir atributo de un elemento XML específico utilizando xslt

<html> 
    <head>...</head> 
    <body> 
     <div id="qaz" theAtribute="44"> 
     </div> 
     <div id ="ddd" theAtribute="4"> 
     <div id= "ggg" theAtribute="9"> 
     </div> 
     </div> 
     <font theAttribute="foo" /> 
    </body> 
</html> 

para convertirse

<html> 
    <head>...</head> 
    <body> 
     <div id="qaz"> 
     </div> 
     <div id ="ddd"> 
     <div id= "ggg"> 
     </div> 
     </div> 
     <font theAttribute="foo" /> 
    </body> 
</html> 

Dónde atributo theAtribute se ha eliminado. Encontré esto, http://www.biglist.com/lists/xsl-list/archives/200404/msg00668.html en base al cual hice intentos para encontrar la solución adecuada.

es decir <xsl:template match="@theAtribute" />

Qué sacó de todo el documento ... y otros como partido, si elija, etc .. Nada funcionó :-(puede usted por favor me ayude en esto? Sonar trivial para mí , pero con XSLT, no puedo hacer frente a todo ...

Gracias a todos de antemano

+0

si desea que el código para ser formateado, puede resaltar el código y haga clic en el botón "010101" en la parte superior del panel de edición, o sangrar el texto 4 espacios. –

Respuesta

22

lo que no funciona? ¿quieres el mismo contenido, pero sin la @theAtribute?

Si es así, asegúrese de que su hoja de estilo tenga la plantilla vacía para @theAtribute, pero también tiene una plantilla de identidad que las copias de todo lo demás en la salida:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <!--empty template suppresses this attribute--> 
    <xsl:template match="@theAtribute" /> 
    <!--identity template copies everything forward by default--> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Si sólo desea suprimir cierta @theAtribute, entonces usted puede hacer que los criterios de coincidencia más específica. Por ejemplo, si sólo desea eliminar ese atributo de la div que es @id="qaz", entonces se podría utilizar esta plantilla:

<xsl:template match="@theAtribute[../@id='qaz']" /> 

o esta plantilla:

<xsl:template match="*[@id='qaz']/@theAtribute" /> 

Si desea eliminar @theAttribute de todos los elementos div, luego cambie la expresión del partido a:

<xsl:template match="div/@theAtribute" /> 
+0

Hola, estos dos he encontrado también tengo miedo pero no son útiles. el primero elimina el "theAtribute" de todas partes (etiquetas divs, body, font, etc.). El segundo enfoque elimina de todas partes @theAtribute de todos los nodos con id = qaz. ¿Hay alguna manera de escribir ?? lo que necesito, es una mezcla de estos dos, creo, pero no puedo entender el formato debido a mi ignorancia sobre xslt. Yo para eliminar theAtribute de todos los divs y solo de divs. – Alexandros

+1

Ya veo. No me di cuenta en la descripción que específicamente deseaba excluir 'div/@ theAtribute'. He actualizado la respuesta.Si sus elementos XML están vinculados a un espacio de nombres, es posible que deba declarar el espacio de nombres en su XSLT, o usar una declaración XPATH que ignore el espacio de nombres y las coincidencias en el nombre local (es decir, '* [local-name() = 'div ']/@ theAtribute') –

+0

¡Funcionó! solución perfecta y respuesta realmente rápida. Gracias Hansen !!!! – Alexandros

8

Dentro de la selección, puede excluir (o incluir) el atributo, usando la función de nombre.

Por ejemplo, <xsl:copy-of select="@*[name(.)!='theAtribute']|node()" />

+0

Esto funcionó bien para mí, quería reemplazar un atributo y luego copiar el resto, y esta expresión funcionó bien para "el resto" – davenpcj

Cuestiones relacionadas