我正在将一个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属性? 感谢
答案 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>