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



如何将给定的xml转换为目标xml,如下所示。我尝试在 xlst 中实现这一点,但它将命名空间添加到"信封"而不是"服务响应">

源 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>

首先,这不是"添加命名空间",而是更改元素的名称。例如,您要将CATEGORY元素的名称从 Q{http://www.scym.com/abcd/dmb/Service/v1}CATEGORY 更改为 Q{}CATEGORY

(我在这里使用的是 XPath 3.0 中的符号Q{namespace}local-part(。

实际上,您似乎已经掌握了您正在以编写match='*'模板规则的方式更改名称,但是当您所需的 XML 输出指示元素(如 CATEGORY(不应位于命名空间中时,您正在将元素(如 (的名称更改为位于命名空间中http://www.scym.com/abcd/dmb/Service/v1

包含 match="/ServiceResponse" 的模板规则将仅匹配 ServiceResponse 元素,该元素是 (a( 文档的最外层元素,以及 (b( 无命名空间。要匹配示例输入中的ServiceResponse,请使用

match="x:ServiceResponse" xmlns:x="http://www.scym.com/abcd/dmb/Service/v1"

相关内容

  • 没有找到相关文章

最新更新