2011-05-24 17 views
5

Mi archivo xml se ve a continuación.Cómo reemplazar una etiqueta con otra etiqueta en xml usando xsl

<rule> 
    <name>86</name> 
    <ruleId>100</ruleId> 
    <ruleVersion>1.0</ruleVersion> 
    <brlVersion>1.0</brlVersion> 
</rule> 

tengo que sustituir nombre con brlName y tengo que añadir esta otra etiqueta drlName.The de salida debería parecerse a continuación.

<rule> 
    <brlName>86</brlName> 
    <ruleId>100</ruleId> 
    <ruleVersion>1.0</ruleVersion> 
    <brlVersion>1.0</brlVersion> 
    <drlName>86_1.0</drlName> 
</rule> 

Ayúdeme con los xsl correspondientes para obtener la salida deseada. ¡Apreciamos tu ayuda!

+0

Buena pregunta, +1. Vea mi respuesta para una solución completa, breve y fácil que se basa en el patrón de diseño XSLT más fundamental y poderoso: utilizar y anular la regla/plantilla de identidad. –

+0

¿Por qué algunas personas hacen preguntas y, después de recibir, déjenme decir, buenas respuestas, no proporcionan ningún comentario? Esto es muy irritante en algún momento. –

+0

Bienvenido a Stack Overflow, empo. – Flynn1179

Respuesta

5

Esta es la tarea típica de la transformación de identidad (la primera regla de plantilla en la transformación a continuación). Solo dos sustituciones (las dos últimas reglas).


XSLT 1.0 probado bajo Saxon 6.5.5

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

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

    <xsl:template match="name"> 
     <brlName><xsl:value-of select="."/></brlName> 
    </xsl:template> 

    <xsl:template match="brlVersion"> 
     <xsl:copy-of select="."/> 
     <drlName><xsl:value-of select="preceding-sibling::name"/>_1.0</drlName> 
    </xsl:template> 

</xsl:stylesheet> 
2

Esta transformación:

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

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

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

<xsl:template match="/*/*[last()]"> 
    <xsl:call-template name="identity"/> 
    <drlName>86_1.0</drlName> 
</xsl:template> 
</xsl:stylesheet> 

cuando se aplica en el documento XML proporcionado:

<rule> 
    <name>86</name> 
    <ruleId>100</ruleId> 
    <ruleVersion>1.0</ruleVersion> 
    <brlVersion>1.0</brlVersion> 
</rule> 

produce el, resultado deseado correcta:

<rule> 
    <brlName>86</brlName> 
    <ruleId>100</ruleId> 
    <ruleVersion>1.0</ruleVersion> 
    <brlVersion>1.0</brlVersion> 
    <drlName>86_1.0</drlName> 
</rule> 

Explicación:

  1. Uso y anulando la regla de identidad/plantilla - el XSLT más fundamental y de gran alcance patrón de diseño.

  2. Anula cualquier elemento denominado name y crea un elemento denominado brlName (cambiar el nombre).

  3. Anula el último elemento secundario del elemento superior. Llamar a la regla de identidad por nombre para este nodo (copiar) y luego crear un elemento denominado drlName con un hijo de nodo de texto específico según los requisitos.

Uso y anulando la regla de identidad/plantilla es el patrón más fundamental y poderoso diseño XSLT. Puede obtener más información al respecto here.

Cuestiones relacionadas