如何将给定的xml转换为目标xml,如下所示。 我尝试在xlst中实现这一点,但它将命名空间添加到" Envelope"而不是" ServiceResponse"
来源xml -
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ServiceResponse xmlns="http://www.scym.com/abcd/dmb/Service/v1">
<RelatedCFR>
<NUMBER>481511</NUMBER>
<CATEGORY>TECHNICAL/BUSINESS APPROVAL</CATEGORY>
<CURRENT_PHASE>CFR PIR/A</CURRENT_PHASE>
<BRIEF_DESCRIPTION>Description Here</BRIEF_DESCRIPTION>
</RelatedCFR>
</ServiceResponse>
</soap:Body>
</soap:Envelope>
需要转换如下 -
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:ServiceResponse xmlns:ns2="http://www.scym.com/abcd/dmb/Service/v1">
<RelatedCFR>
<NUMBER>481511</NUMBER>
<CATEGORY>TECHNICAL/BUSINESS APPROVAL</CATEGORY>
<CURRENT_PHASE>CFR PIR/A</CURRENT_PHASE>
<BRIEF_DESCRIPTION>Description Here</BRIEF_DESCRIPTION>
</RelatedCFR>
</ns2:ServiceResponse>
</soap:Body>
</soap:Envelope>
我在xlst下面试过它不能正常工作
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|text()|comment()|processing-instruction()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/ServiceResponse">
<ns2:ServiceResponse xmlns:ns2="http://www.scym.com/abcd/dmb/Service/v1">
<xsl:apply-templates select="@*|node()"/>
</ns2:ServiceResponse>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}" namespace="http://www.scym.com/abcd/dmb/Service/v1">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:0)
首先,这不是添加命名空间&#34;,它正在改变元素的名称。例如,您要将CATEGORY
元素的名称从Q{http://www.scym.com/abcd/dmb/Service/v1}CATEGORY
更改为Q{}CATEGORY
。
(我在这里使用XPath 3.0中的符号Q{namespace}local-part
。)
您实际上似乎已经意识到您正在以编写match='*'
模板规则的方式更改名称,但您要将CATEGORY
等元素的名称更改为名称空间{ {1}}当您所需的XML输出表明它们应该没有名称空间时。
http://www.scym.com/abcd/dmb/Service/v1
的模板规则只匹配ServiceResponse元素,该元素是(a)文档的最外层元素,(b)没有命名空间。要匹配示例输入中的match="/ServiceResponse"
,请使用
ServiceResponse