Ok, he visto numerosas variaciones en esta pregunta, pero ninguna responde exactamente a lo que trato de resolver y tal vez ' Estoy demasiado densa para ver cómo aplicar una de las otras respuestas a lo que estoy tratando de hacer.Cómo eliminar las entradas xmlns = "" producidas por la transformación XSLT de un documento XML en otro documento XML
que tienen algún XML que se ve algo como lo siguiente:
<?xml version="1.0" encoding="utf-8"?>
<message>
<cmd id="api_info">
<api-version>1.0</api-version>
<api-build>1.0.0.0</api-build>
</cmd>
</message>
Ahora tengo una transformación XSLT que estoy aplicando a este XML. El XSLT es similar al siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
version="2.0">
<xsl:output method="xml" version="1.0" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="message"/>
</xsl:template>
<xsl:template match="message">
<xsl:element name="message" xmlns="http://www.companyname.com/schemas/product/Version001">
<xsl:apply-templates select="/message/cmd/@id"/>
</xsl:element>
</xsl:template>
<xsl:template match="/message/cmd/@id">
<xsl:variable name="_commandType" select="/message/cmd/@id"/>
<xsl:element name="messageHeader">
<xsl:element name="cmdType">
<xsl:value-of select="$_commandType"/>
</xsl:element>
</xsl:element>
<xsl:element name="messageBody">
<xsl:choose>
<xsl:when test="$_commandType = 'api_info'">
<xsl:element name="apiInfoBody">
<xsl:element name="apiVersion">
<xsl:value-of select="/message/cmd/api-version"/>
</xsl:element>
<xsl:element name="apiBuild">
<xsl:value-of select="/message/cmd/api-build"/>
</xsl:element>
</xsl:element>
</xsl:when>
<xsl:when test="$_commandType = 'communicationError'">
<xsl:element name="communicationErrorBody">
<xsl:element name="errorCode">
<xsl:value-of select="error-code"/>
</xsl:element>
<xsl:element name="badCmd">
<xsl:value-of select="bad-cmd"/>
</xsl:element>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
La salida que se ve es básicamente lo que quiero y tiene el siguiente aspecto:
<?xml version="1.0" encoding="UTF-8"?>
<message xmlns="http://www.companyname.com/schemas/product/Version001">
<messageHeader xmlns="">
<cmdType>api_info</cmdType>
</messageHeader>
<messageBody xmlns="">
<apiInfoBody>
<apiVersion>1.0</apiVersion>
<apiBuild>1.0.0.0</apiBuild>
</apiInfoBody>
</messageBody>
</message>
Pero lo que no quiero son los xmlns =" " atributos en el <messageHeader> y <messageBody> elementos.
Ahora he encontrado que si especifico explícitamente el espacio de nombres en el XSLT para esos elementos, entonces el atributo no deseado se empuja un nivel hacia abajo a los elementos secundarios de esos atributos.
tan sólo pudiera ir a través de toda mi XSLT y explícitamente agregar los xmlns = "" http://www.companyname.com/schemas/product/Version001 " atributo para cada uno de mis XSL:. Elemento definiciones, pero sé que tiene que haber una forma más elegante Nosotros los programadores son demasiado perezosos para no tener un atajo para este tipo de tonterías. Si mi XSLT no consistía en algo tan simple como el ejemplo abreviado, me siento tentado a hacerlo de esa manera. Pero sé que debe haber una manera mejor.
¿alguien sabe lo que me falta aquí?
Gracias,
AlarmTripper
no cambió el XML de salida. – AlarmTripper
¿Qué procesador XSLT estás usando? –
Sí, confirmó que su nueva sugerencia también funciona y es probablemente una solución mejor que la mía, ya que mantiene la asignación de xmlns en el elemento de la hoja de estilo. Y la opción #default me impide tener que excluir cada uno de los otros prefijos del espacio de nombres. Muchas gracias. Tengo mucho que aprender sobre este material XSLT y creo que los espacios de nombres son probablemente uno de los aspectos más complicados. – AlarmTripper