xml - vinculado - El motor Safari XSLT pierde el espacio de nombres en los atributos
transformar xml a xslt (2)
Creo que esto es un error. Como un trabajo a su alrededor, podría intentar establecer también el espacio de nombres que desee en xsl:attribute namespace="urn:test:ns2"
.
Tengo un XSLT que coincide con ciertos atributos y los coloca en un espacio de nombres diferente. Aquí hay una versión simplificada:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="urn:test:ns1"
xmlns:ns2="urn:test:ns2">
<xsl:output method="xml" indent="no" encoding="UTF-8"/>
<!-- copy all nodes -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*[starts-with(local-name(), ''test-'')]">
<xsl:attribute name="ns2:{substring-after(local-name(), ''-'')}" namespace="urn:test:ns2">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
Aquí hay algunos ejemplos de entrada:
<?xml version="1.0" encoding="UTF-8" ?>
<hello-world
xmlns="urn:test:ns1"
xmlns:ns3="urn:test:ns3"
rootAttr="stays in implicit namespace"
ns3:passMe="stays in the ns3 namespace"
test-someRootAttr="goes into the ns2 namespace, pulls up ns declaration">
<test
defaultAttr="stays in implicit namespace"
test-someAttr="goes into the ns2 namespace"
ns3:namedAttr="stays in the ns3 namespace">
Something
</test>
<ns3:cat
defaultAttr="stays in the implicit namespace"
test-catName="goes into the ns2 namespace"
ns3:namedAttr="stays in the ns3 namespace">
a cat
</ns3:cat>
</hello-world>
Y aquí está el resultado esperado:
<?xml version="1.0" encoding="UTF-8" ?>
<hello-world
xmlns="urn:test:ns1"
xmlns:ns2="urn:test:ns2"
xmlns:ns3="urn:test:ns3"
rootAttr="stays in implicit namespace"
ns3:passMe="stays in the ns3 namespace"
ns2:someRootAttr="goes into the ns2 namespace, pulls up ns declaration">
<test
defaultAttr="stays in implicit namespace"
ns2:someAttr="goes into the ns2 namespace"
ns3:namedAttr="stays in the ns3 namespace">
Something
</test>
<ns3:cat
defaultAttr="stays in the implicit namespace"
ns2:catName="goes into the ns2 namespace"
ns3:namedAttr="stays in the ns3 namespace">
a cat
</ns3:cat>
</hello-world>
Esto funciona bien en Chrome, Firefox, IE 9+ y Android. Sin embargo, en Safari, obtengo la siguiente salida:
<?xml version="1.0" encoding="UTF-8" ?>
<hello-world
xmlns="urn:test:ns1"
xmlns:ns3="urn:test:ns3"
xmlns:ns2="urn:test:ns2"
rootAttr="stays in implicit namespace"
passMe="stays in the ns3 namespace"
someRootAttr="goes into the ns2 namespace, pulls up ns declaration">
<test
defaultAttr="stays in implicit namespace"
someAttr="goes into the ns2 namespace"
namedAttr="stays in the ns3 namespace">
Something
</test>
<ns3:cat
defaultAttr="stays in the implicit namespace"
catName="goes into the ns2 namespace"
namedAttr="stays in the ns3 namespace">
a cat
</ns3:cat>
</hello-world>
Tenga en cuenta que las declaraciones del espacio de nombres son correctas, pero a los atributos les falta el prefijo del espacio de nombres deseado.
Todo este código está en un proyecto github , que está construido por TravisCI y utiliza Sauce Labs para probar en diferentes combos navegador / sistema operativo.
¿Puedo hacer algo diferente con mi XSLT que sería una forma más correcta de lograr esto, que podría funcionar en todos los motores? ¿O es solo un error en Safari? Cualquier idea para soluciones alternativas sería muy apreciada.
Sin ninguna evidencia de lo contrario, esto parece ser un error en Safari. He informado esto a Apple ( rdar://23207226
), pero hasta ahora no he escuchado nada de ellos.
La única solución disponible es ejecutar XSLT en algún otro motor (en el lado del servidor, o quizás a través de un motor de javascript de terceros).