使用xslt 1.0将命名空间添加到特定的根元素

时间:2018-03-21 08:34:23

标签: xml xslt-1.0

如何将给定的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>

1 个答案:

答案 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