transformar xml xslt

transformar - Convertir elementos XML en atributos XML utilizando XSLT



xml stylesheet (5)

Eso debería funcionar:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="INVENTORY"> <INVENTORY> <xsl:apply-templates/> </INVENTORY> </xsl:template> <xsl:template match="ITEM"> <ITEM> <xsl:for-each select="*"> <xsl:attribute name="{name()}"> <xsl:value-of select="text()"/> </xsl:attribute> </xsl:for-each> </ITEM> </xsl:template> </xsl:stylesheet>

HTH

Tenemos un sistema actual que genera un archivo XML que está en el siguiente formato:

<INVENTORY> <ITEM> <SERIALNUMBER>something</SERIALNUMBER> <LOCATION>something</LOCATION> <BARCODE>something</BARCODE> </ITEM> </INVENTORY>

Necesito usar estos datos para cargar en la cuadrícula estándar .NET 2.0. Pero la cuadrícula necesita que el XML esté en el siguiente formato:

<INVENTORY> <ITEM serialNumber="something" location="something" barcode="something"> </ITEM> </INVENTORY>

es decir, los nodos secundarios del elemento deben convertirse en atributos del nodo del elemento.

¿Alguien sabe cómo se puede hacer esto usando XSLT?


Estas dos plantillas deben hacerlo: -

<xsl:template match="ITEM"> <ITEM serialNumber="{SERIALNUMBER}" location="{LOCATION}" barcode="{BARCODE}" /> </xsl:template> <xsl:template match="INVENTORY"> <INVENTORY> <xsl:apply-templates /> </INVENTORY> </xsl:template>


Esto debería hacerlo:

<xsl:for-each select="//ITEM"> <xsl:element name="ITEM"> <xsl:attribute name="serialNumber"> <xsl:value-of select="SERIALNUMBER"/> </xsl:attribute> <xsl:attribute name="location"> <xsl:value-of select="LOCATION"/> </xsl:attribute> <xsl:attribute name="barcode"> <xsl:value-of select="BARCODE"/> </xsl:attribute> </xsl:element> </xsl:for-each>

O usando el atajo de David:

<xsl:for-each select="//ITEM"> <ITEM serialNumber="{SERIALNUMBER}" location="{LOCATION}" barcode="{BARCODE}"/> </xsl:for-each>


Si su fuente se ve así:

<row><a>1</a><b>2</b></row>

y quieres que se vea así:

<row a="1" b="2" />

entonces este XSLT debería funcionar:

<xsl:template match="row"> <row a="{a}" b="{b}" /> </xsl:template>


Esta es probablemente la solución más sencilla que convertirá cualquier elemento ITEM de ITEM a sus atributos y reproducirá todo lo demás tal como está, al mismo tiempo que convierte los nombres de los elementos en cualquier nombre de atributo deseado:

<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:variable name="vrtfNameMapping"> <item name="SERIALNUMBER" newName="serialNumber"/> <item name="LOCATION" newName="location"/> <item name="BARCODE" newName="barcode"/> </xsl:variable> <!-- --> <xsl:variable name="vNameMapping" select= "document('''')/*/xsl:variable[@name=''vrtfNameMapping'']"/> <!-- --> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <!-- --> <xsl:template match="ITEM/*"> <xsl:attribute name= "{$vNameMapping/*[@name=name(current())]/@newName}"> <xsl:value-of select="."/> </xsl:attribute> </xsl:template> </xsl:stylesheet>

cuando la transformación anterior se aplica en el documento XML proporcionado :

<INVENTORY> <ITEM> <SERIALNUMBER>something</SERIALNUMBER> <LOCATION>something</LOCATION> <BARCODE>something</BARCODE> </ITEM> </INVENTORY>

Se produce el resultado deseado :

<INVENTORY> <ITEM serialNumber="something" location="something" barcode="something"/> </INVENTORY>

Tenga en cuenta lo siguiente:

  1. El uso de la regla de identidad.

  2. El uso de <xsl:strip-space elements="*"/>

  3. El uso de la variable vrtfNameMapping sin ninguna función de extensión xxx:node-set() .

  4. El hecho de que manejamos cualquier mapeo entre un nombre y un nuevoNombre, no solo una simple carátula inferior.