Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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

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
Xml 如何编写在文本元素中保留名称空间引用的XSLT?_Xml_Xslt_Soap - Fatal编程技术网

Xml 如何编写在文本元素中保留名称空间引用的XSLT?

Xml 如何编写在文本元素中保留名称空间引用的XSLT?,xml,xslt,soap,Xml,Xslt,Soap,我正在编写一个XSLT,它将SOAP1.2错误转换为SOAP1.1错误。我正在使用XSLTv2.0,我正在用Java进行转换;可能使用Xerces或Java附带的任何XML转换。Soap 1.2故障的各个部分如下所示: <soap12:code xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> <soap12:Value>soap12:Sender</soap12:Value> ... &l

我正在编写一个XSLT,它将SOAP1.2错误转换为SOAP1.1错误。我正在使用XSLTv2.0,我正在用Java进行转换;可能使用Xerces或Java附带的任何XML转换。Soap 1.2故障的各个部分如下所示:

<soap12:code xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Value>soap12:Sender</soap12:Value>
  ...
</soap12:code>
<soap11:Fault xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">
  <faultcode>soap11:Server</faultcode>
  ...
</soap11:Fault>

soap12:发送方
...
但Soap 1.1的错误如下所示:

<soap12:code xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Value>soap12:Sender</soap12:Value>
  ...
</soap12:code>
<soap11:Fault xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">
  <faultcode>soap11:Server</faultcode>
  ...
</soap11:Fault>

soap11:服务器
...
所以,棘手的部分是我的XSLT需要生成类似“soap11:server”的内容。它需要使用XSLT引擎选择的任何适当前缀引用soap11名称空间。它可能是一个类似“soap11”的前缀,但也可能是一个类似“soap”或“ns1”的前缀,具体取决于输入文档的外观。现在,对于属性和元素,XSLT引擎将为您处理这一问题,生成具有正确前缀的属性/元素。但是,当这些名称空间引用出现在原始文本中时,它不会修改它们。以下是我的XSLT的相关部分:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"
    exclude-result-prefixes="soap12"
    version="2.0">

    <xsl:template match="soap12:Fault">
        <soap11:Fault>
            <!-- presumably some mapping logic will go here -->
            <faultcode>soap11:Server</faultcode>
            ...
        </soap11:Fault>
    </xsl:template>
    ...
</xsl:stylesheet>

soap11:服务器
...
...

有没有办法告诉XSLT“soap11:Server”在这里指的是soap11名称空间?

您的代码是正确的。您可以通过运行转换和:

  • 看看结果

  • 使用XML解析器解析结果以验证这是一个格式良好的XML文档


  • 您的代码是正确的。您可以通过运行转换和:

  • 看看结果

  • 使用XML解析器解析结果以验证这是一个格式良好的XML文档


  • 让我们试着找出您使用的是XSLT1.0还是XSLT2.0。您说您使用的是XSLT2.0,但您也说您使用的是JDK中的默认XSLT引擎,它只支持XSLT1.0

    这个问题是相关的,因为XSLT 1.0允许转换引擎(实际上是序列化程序)选择输出中将使用的前缀,而XSLT 2.0规定了前缀的选择(除非在极少数情况下,处理器必须不知从何处构思前缀)


    因此,答案是:如果您使用的是XSLT1.0引擎(看起来是这样),那么语言规范不会保证输出中的名称空间前缀,尽管在实践中,大多数处理器在简单的情况下都会做合理的事情。如果您想得到保证,就必须使用XSLT 2.0处理器。

    让我们来看看您使用的是XSLT 1.0还是XSLT 2.0。您说您使用的是XSLT2.0,但您也说您使用的是JDK中的默认XSLT引擎,它只支持XSLT1.0

    这个问题是相关的,因为XSLT 1.0允许转换引擎(实际上是序列化程序)选择输出中将使用的前缀,而XSLT 2.0规定了前缀的选择(除非在极少数情况下,处理器必须不知从何处构思前缀)


    因此,答案是:如果您使用的是XSLT1.0引擎(看起来是这样),那么语言规范不会保证输出中的名称空间前缀,尽管在实践中,大多数处理器在简单的情况下都会做合理的事情。如果您想要得到保证,就必须使用XSLT 2.0处理器。

    当您说“它需要使用XSLT引擎选择的任何适当前缀引用soap11命名空间”时,您的意思是什么?作为样式表的作者,您可以决定使用什么前缀。嗯,您的意思是我可以依赖这样一个事实,考虑到我上面描述的XSLT;输出将100%始终使用SOAP1.1名称空间前缀“soap11”?我不知道这是XSLT规范的一部分。我认为XSLT引擎可以自由选择自己的名称空间前缀。您是在输出文档中引入soap11名称空间,对吗?它不在输入文档中。如果我错了,请纠正我。是的,你是对的。我认为您是对的-安全地假设XML将使用“soap11”作为正确的前缀生成,因此在本例中对前缀进行“硬编码”是安全的。当您说“它需要使用XSLT引擎选择的任何适当前缀引用soap11命名空间”时,您的意思是什么?作为样式表的作者,您可以决定使用什么前缀。嗯,您的意思是我可以依赖这样一个事实,考虑到我上面描述的XSLT;输出将100%始终使用SOAP1.1名称空间前缀“soap11”?我不知道这是XSLT规范的一部分。我认为XSLT引擎可以自由选择自己的名称空间前缀。您是在输出文档中引入soap11名称空间,对吗?它不在输入文档中。如果我错了,请纠正我。是的,你是对的。我认为你是对的-这是一个安全的假设,XML将使用“soap11”作为正确的前缀生成,因此在本例中对前缀进行“硬编码”是安全的。我目前正在使用Xalan,您是对的,它是一个XSLT1.0处理器。我说过我是根据XSLT的“版本”标记使用XSLT 2.0的,但这是误导性的。小补充:XSLT 2.0还提供QName数据类型处理。很抱歉,忽略了这个细节。我目前正在使用Xalan,您是对的,它是一个XSLT1.0处理器。我说过我是根据XSLT的“version”标记使用XSLT 2.0的,但这有误导性。小补充:XSLT 2.0还提供QName数据类型处理。谢谢,你说得对。我假设我需要特别考虑通知XSLT解析器“soap11:Server”指的是名称空间前缀;不过,在这种情况下,这是不必要的。谢谢,你说得对。我假设我需要特别考虑通知XSLT解析器“soap11:Server”指的是名称空间前缀;然而,在这种情况下,这是不必要的。