Xml 如何编写在文本元素中保留名称空间引用的XSLT?
我正在编写一个XSLT,它将SOAP1.2错误转换为SOAP1.1错误。我正在使用XSLTv2.0,我正在用Java进行转换;可能使用Xerces或Java附带的任何XML转换。Soap 1.2故障的各个部分如下所示: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
<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名称空间?您的代码是正确的。您可以通过运行转换和:
您的代码是正确的。您可以通过运行转换和:
让我们试着找出您使用的是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”指的是名称空间前缀;然而,在这种情况下,这是不必要的。