我有一个XSLT匹配某些属性,并将它们放在不同的命名空间中.这是一个简化版本:
<?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>
以下是一些示例输入:
<?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>
这是预期的输出:
<?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>
这可以在Chrome,Firefox,IE 9和Android上正常工作.但是在Safari中,我会得到以下输出:
<?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>
请注意,命名空间声明是正确的,但属性缺少所需的命名空间前缀.
所有这些代码都是github project,它由TravisCI构建,并使用Sauce Labs在不同的浏览器/操作系统上进行测试.
我可以用XSLT做一些不同的事情,这将是一个更正确的方式来完成这一点,这可能适用于所有的引擎?还是这只是Safari中的一个bug?任何解决方法的想法将不胜感激.
我认为这是一个bug.作为一个工作,您可以尝试在xsl:attribute namespace =“urn:test:ns2”上设置所需的命名空间.