单个xsl中的命名空间和soap标签

时间:2014-04-14 20:27:09

标签: xml xslt soap

输入:

<user>
  <firstName>John</firstName>
  <lastName>Doe</lastName>   
</user>

输出:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://www.abc.com/v1">
<soapenv:Header/>
<soapenv:Body>
  <v1:user>
     <v1:firstName>John</v1:firstName>
     <v1:lastName>Doe</v1:lastName>         
  </v1:user>
</soapenv:Body>
</soapenv:Envelope>

我能够通过使用身份转换在一个xsl中添加命名空间并使用另一个xsl添加soap标记来实现此目的 但是无法在单个xsl中完成。

任何人都可以帮我实现单个xslt

2 个答案:

答案 0 :(得分:1)

您的源文档属于无命名空间,其余代码是静态的。要简单地为源文档中的元素添加前缀,请匹配它们( * )并创建前缀为v1的副本,并应用具有namespace属性的命名空间。下面的XSLT产生了你期望的结果:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output indent="yes"/>
    <xsl:template match="/">
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                          xmlns:v1="http://www.abc.com/v1">
            <soapenv:Header/>
            <soapenv:Body>
                <xsl:apply-templates />
            </soapenv:Body>
        </soapenv:Envelope>
    </xsl:template>

    <xsl:template match="*">
          <xsl:element name="v1:{name()}" namespace="http://www.abc.com/v1">
             <xsl:apply-templates/>
         </xsl:element>
    </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

编写一个匹配/的模板,输出SOAP元素并在其中执行apply-templates,然后您可以添加更改输入元素命名空间的模板。