【问题标题】:Select all nodes under one node and add prefix using XSLT选择一个节点下的所有节点并使用 XSLT 添加前缀
【发布时间】:2021-01-28 09:50:17
【问题描述】:

我正在尝试编写一个 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>

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

【问题讨论】:

  • 您的输入样本甚至不是命名空间格式良好的 XML,请显示任何相关的命名空间声明,如果 XML 中使用了前缀,则需要存在相应的命名空间声明。并为输入样本显示想要的结果样本。
  • 您好 Martin,感谢您的回复,我添加了预期结果(命名空间不是公共的)
  • 请模拟任何命名空间声明,例如xmlns:sob="http://example.com/sob",但我们需要看看你想要他们在哪里
  • 我想添加前缀,因为我添加了预期的转换而不是命名空间,你能看看我添加了什么吗?谢谢
  • 正如我所说,没有命名空间声明的sob:instance 不是命名空间格式良好的 XML,因此无法使用 XSLT 生成,您需要为使用的前缀显示任何命名空间声明。

标签: xml xslt wso2 soapui


【解决方案1】:

最短的格式

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

【讨论】:

  • 非常有帮助!!我得到了我想要的,非常感谢马丁 :)
  • 请告诉我,我在“mes:caseInfos”(实例和案例)的孩子上有“sob”的命名空间,我该如何摆脱?再次感谢
  • @soukaina,抱歉,除非您使用所有必要的命名空间声明编辑问题中的示例,否则我们永远不会确切知道您想要实现什么。要将命名空间声明移动到特定位置,在 XSLT 2 及更高版本中,您需要使用 xsl:namespace
  • 我添加了所有的命名空间,你能检查一下吗?谢谢
  • 与第一个 XSLT 的结果相同:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-11
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多