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:
El uso de la regla de identidad.
El uso de
<xsl:strip-space elements="*"/>
El uso de la variable
vrtfNameMapping
sin ninguna función de extensiónxxx:node-set()
.El hecho de que manejamos cualquier mapeo entre un nombre y un nuevoNombre, no solo una simple carátula inferior.