首页 > 解决方案 > 选择一个节点下的所有节点并使用 XSLT 添加前缀

问题描述

我正在尝试编写 XSLT 代码以将 sob 前缀命名空间添加到 mes:caseInfos 的所有节点(子节点和兄弟节点)

我想为 mes:caseInfos 的所有子元素添加 sob 前缀,如下所示

<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:mes="namespace/service/servicename/messages/v1"
xmlns:cme="namespace/type/common/messages/v1"
xmlns:sob="namespace/type/servicename/types/mes"
xmlns:exc="namespace/type/common/exceptions/v1">
        <soapenv:Body>
            <mes:getCaseInfosResponse>
                <mes:messageContext>
                    <cme:timestamp>2021-01-27T15</cme:timestamp>
                </mes:messageContext>
                <mes:responses>
                    <mes:response>
                        <mes:caseInfos>
                            <instance>
                                <instanceId>AC_WSPmockedInstanceId</instanceId>
                            </instance>
                            <case>
                                <id>AC_WSPmockedId</id>
                                <caseTexts>
                                    <type>AC_WSPmockedType1</type>
                                </caseTexts>
                                <caseTexts>
                                    <type>AC_WSPmockedType2</type>
                                </caseTexts>
                                <decision>
                                    <code>AC_WSPmockedCode</code>
                                    <labelFr>AC_WSPmockedLabelFr</labelFr>
                                </decision>
                                <extracts>
                                    <extractFrStatus>AC_WSPmockedExtractFrStatus</extractFrStatus>
                                </extracts>
                            </case>
                        </mes:caseInfos>
                    </mes:response>
                </mes:responses>
            </mes:getCaseInfosResponse>
        </soapenv:Body>
    </soapenv:Envelope>

我想出了这个 XSLT,我尝试了这个(以及许多其他更改 XPath..)

 <?xml version="1.0" encoding="UTF-8"?>
   <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:mes="namespace/service/servicename/messages/v1"
    xmlns:cme="namespace/type/common/messages/v1" xmlns:sob="namespace/type/servicename/types/v1"
    version="1.0">
        <xsl:output omit-xml-declaration="yes" />
        <!-- Copies all the nodes as is -->
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()" />
            </xsl:copy>
        </xsl:template>
    
        <!-- Select the element need to be apply the prefix -->
            <xsl:template match="//mes:response/descendant-or-self::caseInfos">
            <!--Define the namespace with prefix ns0 -->
            <xsl:element name="sob:{name()}" >
                <!--apply to above selected node -->
                <xsl:apply-templates select="node()|@*">
                </xsl:apply-templates>
            </xsl:element>
        </xsl:template>
    
    </xsl:stylesheet>

预期转型

    <soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:mes="namespace/service/servicename/messages/v1"
xmlns:cme="namespace/type/common/messages/v1"
xmlns:sob="namespace/type/servicename/types/mes"
xmlns:exc="namespace/type/common/exceptions/v1">
    <soapenv:Body>
        <mes:getCaseInfosResponse>
            <mes:messageContext>
                <cme:messageId >4c22aa14-e54f-413a-93f5-26b96434d22e</cme:messageId>
                
            </mes:messageContext>
            <mes:responses>
                <mes:response>
                    <mes:caseInfos>
                        <sob:instance>
                            <sob:instanceId>AC_WSPmockedInstanceId</sob:instanceId>
                        </instance>
                        <sob:case>
                            <sob:id>AC_WSPmockedId</sob:id>
                            <sob:caseTexts>
                                <sob:type>AC_WSPmockedType1</sob:type>
                            </sob:caseTexts>
                            <sob:caseTexts>
                                <sob:type>AC_WSPmockedType2</sob:type>
                            </sob:caseTexts>
                            <sob:decision>
                                <sob:code>AC_WSPmockedCode</sob:code>
                            </sob:decision>
                            <sob:extracts>
                                <sob:extractFrStatus>AC_WSPmockedExtractFrStatus</sob:extractFrStatus>
                            </sob:extracts>
                        </case>
                    </mes:caseInfos>
                </mes:response>
            </mes:responses>
        </mes:getCaseInfosResponse>
    </soapenv:Body>
</soapenv:Envelope>

任何帮助将不胜感激!:) 苏凯纳

标签: xmlxsltwso2soapui

解决方案


最短的形式是

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:sob="namespace/type/servicename/types/mes"
    version="1.0">

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="mes:caseInfos//*" xmlns:mes="namespace/service/servicename/messages/v1">
      <xsl:element name="sob:{local-name()}">
          <xsl:apply-templates select="@* | node()"/>
      </xsl:element>
  </xsl:template>

</xsl:stylesheet>

推荐阅读