XSLT创建没有命名空间的内容

时间:2014-04-04 12:37:54

标签: xslt namespaces wso2esb

我正在将一个XML转换为wso2esb中的另一个XML(使用saxon)。我有以下输入示例:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
        <root>
            <MyElement>content</MyElement>
        </root>
    </soapenv:Body>
</soapenv:Envelope>

我的问题是,我的新内容<NEW>不应该获得任何命名空间。但是在我的XSLT之后我得到了以下输出:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <root>
         <NEW xmlns="http://ws.apache.org/ns/synapse">content</NEW>
      </root>
   </soapenv:Body>
</soapenv:Envelope>

我不希望新元素中的xmlns="http://ws.apache.org/ns/synapse"声明。当我使用oXygen测试它确实有效,但是当我在wso2esb中运行它时,我得到了我猜的默认命名空间“http://ws.apache.org/ns/synapse”。

所以我尝试了3种创建NEW元素的方法,

<xsl:stylesheet xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:avintis="http://www.avintis.com/esb" extension-element-prefixes="avintis" version="2.0" exclude-result-prefixes="#all" xpath-default-namespace="">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="/soapenv:Envelope|soapenv:Body">
        <xsl:copy>
            <xsl:apply-templates select="*|text()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="root">
        <xsl:copy>
            <!-- FIRST METHOD - THE METHOD I want to use! this will receive the  xmlns="http://ws.apache.org/ns/synapse" -->
            <NEW>
                <xsl:value-of select="MyElement"/>
            </NEW>
            <!-- Second methodworks - but I need to add xmlns="" to every element and there are a lot-->
            <NEW xmlns="">
                <xsl:value-of select="MyElement"/>
            </NEW>
            <!-- Third method works: But not very readable - I would prefer the first method -->
            <xsl:element name="NEW">
                <xsl:value-of select="MyElement"/>
            </xsl:element>
         </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

在使用第一个元素创建方法时,有没有办法删除此xmlns属性? 感谢

2 个答案:

答案 0 :(得分:2)

问题不在于序列化输出中存在不需要的命名空间声明;问题是NEW元素在错误的命名空间中。您需要考虑元素和属性的(扩展)名称是什么,名称空间声明将自己看。

我强烈怀疑您执行的代码与您向我们展示的代码不同。我认为它必须在<NEW>文字结果元素的某个祖先上有默认的名称空间声明xmlns =“http://ws.apache.org/ns/synapse”,可能在xsl:stylesheet元素本身上。如果情况并非如此,那么wso2esb在运行代码时会做一些非常奇怪的事情。

答案 1 :(得分:0)

通过向xmlns=""添加<xsl:stylesheet来找到解决方案。似乎WSO2在没有指定时提供默认命名空间。

<xsl:stylesheet xmlns="" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:avintis="http://www.avintis.com/esb" extension-element-prefixes="avintis" version="2.0" exclude-result-prefixes="#all" xpath-default-namespace="">
<xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>

<xsl:template match="/soapenv:Envelope|soapenv:Body">
    <xsl:copy>
        <xsl:apply-templates select="*|text()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="root">
    <xsl:copy>
        <!-- FIRST METHOD - THE METHOD I want to use! this will receive the  xmlns="http://ws.apache.org/ns/synapse" -->
        <NEW>
            <xsl:value-of select="MyElement"/>
        </NEW>
        <!-- Second methodworks - but I need to add xmlns="" to every element and there are a lot-->
        <NEW xmlns="">
            <xsl:value-of select="MyElement"/>
        </NEW>
        <!-- Third method works: But not very readable - I would prefer the first method -->
        <xsl:element name="NEW">
            <xsl:value-of select="MyElement"/>
        </xsl:element>
     </xsl:copy>
</xsl:template>