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

时间:2011-02-15 23:30:33

标签: xml xslt soap

我正在编写一个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名称空间?

2 个答案:

答案 0 :(得分:2)

您的代码是正确的。您可以通过运行转换来验证这一点:

  1. 查看结果。

  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处理器。

相关问题