Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
xsl命名空间从根节点复制到子节点,复制命名空间=";否";不工作(xslt 3.0版本)_Xslt_Namespaces - Fatal编程技术网

xsl命名空间从根节点复制到子节点,复制命名空间=";否";不工作(xslt 3.0版本)

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

我正在使用源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/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>
   &lt;child xmlns="http://test.com"&gt;
       &lt;element1&gt;1&lt;/element1&gt;
   &lt;/child&gt;   
   </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>
   &lt;child xmlns="http://test.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
       &lt;element1&gt;1&lt;/element1&gt;
   &lt;/child&gt;   
   </parentdtl>
   <outer>T</outer>
</root>

测试
子xmlns=”http://test.com“xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance"
元素11/元素1
/孩子
T
面对XSL脚本中的两个问题

  • XSL在转义时从根目录到子目录包含一个名称空间。 xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance,但在转义
    节点时不应包括此名称空间,但在转换过程中应保留
    节点的原始名称空间

  • 根目录中的名称空间并非全部复制到结果XML中。 xsi:schemaLocation=”http://mspdv170.us.oracle.com:7779/rib-func artifact/integration/xsd/RibMessages.xsd” 结果xml的父节点
    中缺少

  • 请分享我的任何建议,因为我对XSLT非常陌生。
    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,它在项目中运行得非常好。