我正在编写一个XSLT,它将SOAP 1.2故障转换为SOAP 1.1故障。我正在使用XSLT v2.0,我正在用Java进行转换;可能使用Xerces或捆绑的任何XML转换Java。 Soap 1.2故障的部分看起来像这样:
<soap12:code xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Value>soap12:Sender</soap12:Value>
...
</soap12:code>
但是Soap 1.1的错误看起来像这样:
<soap11:Fault xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">
<faultcode>soap11:Server</faultcode>
...
</soap11:Fault>
所以,棘手的部分是我的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>
有没有办法告诉XSLT“soap11:Server”在这个上下文中是指soap11名称空间?
答案 0 :(得分:2)
您的代码是正确的。您可以通过运行转换来验证这一点:
查看结果。
使用XML解析器解析结果,以验证这是一个结构良好的XML文档。
答案 1 :(得分:1)
让我们试着弄清楚您是使用XSLT 1.0还是XSLT 2.0。你说你正在使用XSLT 2.0,但你也说你在JDK中使用默认的XSLT引擎,它只支持XSLT 1.0。
问题是相关的,因为XSLT 1.0允许转换引擎(实际上是序列化程序)选择将在输出中使用哪些前缀,而XSLT 2.0则规定了前缀的选择(除了极少数情况下处理器必须从无处想出一个前缀。)
所以答案是:如果您正在使用XSLT 1.0引擎,那么语言规范就不能保证输出中的命名空间前缀,但实际上大多数处理器都会做出合理的事情。在直截了当的情况下。如果您需要保证,则必须转移到XSLT 2.0处理器。