xsl命名空间从根节点复制到子节点,复制命名空间=";否";不工作(xslt 3.0版本)
我正在使用源xml尝试的脚本,其结果在下面的fiddle工具链接中提供 源XML:xsl命名空间从根节点复制到子节点,复制命名空间=";否";不工作(xslt 3.0版本),xslt,namespaces,Xslt,Namespaces,我正在使用源xml尝试的脚本,其结果在下面的fiddle工具链接中提供 源XML: <root xmlns="http://www.oracle.com/retail/integration/rib/RibMessages" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mspdv170.us.oracle.com:7779
<root xmlns="http://www.oracle.com/retail/integration/rib/RibMessages" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mspdv170.us.oracle.com:7779/rib-func-artifact/integration/xsd/RibMessages.xsd">
<parent>test</parent>
<parentdtl>
<child xmlns="http://test.com">
<element1>1</element1>
</child>
</parentdtl>
<outer>T</outer>
</root>
测试
1.
T
使用的XSL脚本:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://mspdv170.us.oracle.com:7779/rib-func-artifact/integration/xsd/RibMessages.xsd"
exclude-result-prefixes="#all"
version="3.0">
<xsl:template match="*">
<xsl:variable name="copy-sans-namespaces" as="element()">
<xsl:copy-of select="." copy-namespaces="no"/>
</xsl:variable>
<xsl:variable name="ser-params" as="element()">
<output:serialization-parameters xmlns:output="http://www.w3.org/2010/xslt-xquery-serialization">
<output:omit-xml-declaration value="yes" />
</output:serialization-parameters>
</xsl:variable>
<xsl:value-of select="serialize($copy-sans-namespaces, $ser-params)" />
</xsl:template>
<xsl:template match="*:root|*:parent|*:parentdtl|*:outer">
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
预期产出:
<?xml version="1.0" encoding="UTF-8"?><root xmlns="http://www.oracle.com/retail/integration/rib/RibMessages" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://mspdv170.us.oracle.com:7779/rib-func-artifact/integration/xsd/RibMessages.xsd">
<parent>test</parent>
<parentdtl>
<child xmlns="http://test.com">
<element1>1</element1>
</child>
</parentdtl>
<outer>T</outer>
</root>
测试
子xmlns=”http://test.com"
元素11/元素1
/孩子
T
相反,我收到了下面的结果
<?xml version="1.0" encoding="UTF-8"?><root xmlns="http://www.oracle.com/retail/integration/rib/RibMessages" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<parent>test</parent>
<parentdtl>
<child xmlns="http://test.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<element1>1</element1>
</child>
</parentdtl>
<outer>T</outer>
</root>
测试
子xmlns=”http://test.com“xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance"
元素11/元素1
/孩子
T
面对XSL脚本中的两个问题
节点时不应包括此名称空间,但在转换过程中应保留
节点的原始名称空间
中缺少
XSL版本是3.0,在我正在进行的项目中使用了SAXON 9.6引擎。SAXON 9.6的行为似乎是SAXON 10.2中仍然存在的一个错误,我询问了导致错误问题的原因 作为一种解决方法,我想您需要通过节点推动元素,使用
xsl:element
进行复制,避免名称空间复制:
<xsl:template match="*" mode="strip-in-scope-namespaces">
<xsl:element name="{name()}" namespace="{namespace-uri()}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates mode="#current"/>
</xsl:element>
</xsl:template>
<xsl:template match="*">
<xsl:variable name="copy-sans-namespaces" as="element()">
<xsl:apply-templates select="." mode="strip-in-scope-namespaces"/>
</xsl:variable>
<xsl:variable name="ser-params" as="element()">
<output:serialization-parameters xmlns:output="http://www.w3.org/2010/xslt-xquery-serialization">
<output:omit-xml-declaration value="yes" />
</output:serialization-parameters>
</xsl:variable>
<xsl:value-of select="serialize($copy-sans-namespaces, $ser-params)" />
</xsl:template>
看来您在Saxon 9.6中的行为是Saxon 10.2中仍然存在的一个bug,我询问了导致bug问题的原因 作为一种解决方法,我想您需要通过节点推动元素,使用
xsl:element
进行复制,避免名称空间复制:
<xsl:template match="*" mode="strip-in-scope-namespaces">
<xsl:element name="{name()}" namespace="{namespace-uri()}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates mode="#current"/>
</xsl:element>
</xsl:template>
<xsl:template match="*">
<xsl:variable name="copy-sans-namespaces" as="element()">
<xsl:apply-templates select="." mode="strip-in-scope-namespaces"/>
</xsl:variable>
<xsl:variable name="ser-params" as="element()">
<output:serialization-parameters xmlns:output="http://www.w3.org/2010/xslt-xquery-serialization">
<output:omit-xml-declaration value="yes" />
</output:serialization-parameters>
</xsl:variable>
<xsl:value-of select="serialize($copy-sans-namespaces, $ser-params)" />
</xsl:template>
请在StackOverflow上的问题中包含XML和XSLT的相关示例以及所需和当前输出。链接到在线示例是不够的。嗨,Martin,请查看更新了详细信息的问题。据我所知,这是Saxon的一个怪癖或错误,我在Saxonica论坛上问过,让我们听听他们的想法。我不知道如何解决您的输入情况,您可以尝试通过另一种模式来推动您的元素,使用
xsl:element
而不是xsl:copy of
来重新创建元素节点,这样就不应该复制名称空间。请在StackOverflow的问题中包括XML和XSLT的相关示例以及所需和当前输出。链接到在线示例是不够的。嗨,Martin,请查看更新了详细信息的问题。据我所知,这是Saxon的一个怪癖或错误,我在Saxonica论坛上问过,让我们听听他们的想法。我不知道如何解决您的输入情况,您可以尝试通过另一种模式来推动元素,使用xsl:element
而不是xsl:copy of
来重新创建元素节点,这样就不应该复制名称空间。谢谢Martin,这真的很有帮助。请再澄清一下。在节点中,它没有复制所有的名称空间xsi:schemalocation没有出现在结果XML中。这是一个bug还是脚本中需要更改的内容。@Prasanth,请参见编辑,您需要通过复制属性。谢谢Martin,它在项目中运行得非常好。谢谢Martin,这真的很有帮助。请再澄清一下。在节点中,它没有复制所有的名称空间xsi:schemalocation没有出现在结果XML中。这是一个bug还是脚本中需要更改的内容。@Prasanth,请参阅编辑,您需要通过复制属性。谢谢Martin,它在项目中运行得非常好。