如何使用xslt解析另一个xml的CDATA内的xml?

Sha*_*kar 6 xslt xsl-fo xslt-2.0 xslt-1.0

我需要使用单个XSLT转换XML的CDATA内的XML.

我有一个XML,如下面的CDATA中的xml,如下面的xml.

    <message channel-id="e01db0aa-b3db-4b6c-a055-7a0d5c1d1f20" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" >
    <send-parameters>
               <agent-parameter multi-valued="false">
                 <name>Networks</name>
                 <value><![CDATA[<Networks>
    <Network>
      <GroupCode>EXTPRI</GroupCode>
      <NetworkTypeId>LANI</NetworkTypeId>   
      <OrgNetworkPlatformName>EON-0cbu0cust12301dcd-D-PCL-0002</OrgNetworkPlatformName>
      <OrgNetworkPlatformID>urn:vcloud:network:b7ccfd5f-cfd7-48eb-9dd6-1989b08d7b86</OrgNetworkPlatformID>
      </Network>
      <Network>
      <GroupCode>EXTPRI</GroupCode>
      <NetworkTypeId>LANI</NetworkTypeId>   
      <OrgNetworkPlatformName>ABC-0cbu0cust12301dcd-D-PCL-XYZ</OrgNetworkPlatformName>
      <OrgNetworkPlatformID>urn:vcloud:network:b7ccfd5f-cfd7-48eb-9dd6-1989b08d7b86</OrgNetworkPlatformID>
    </Network>

    </Networks>]]></value>
               </agent-parameter>

                        </send-parameters>
          </message>
Run Code Online (Sandbox Code Playgroud)

我需要将xml转换为:

    <?xml version="1.0" encoding="UTF-8"?>
    <message xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" channel-id="7652d759-4b32-44d4-8a27-9e390f0cae7b">
        <send-parameters>
            <agent-parameter multi-valued="false">
                <name>ExternalPublicOrgNWPlatformID_DDC</name>
                <value>EON-0cbu0cust12301dcd-D-PCL-0002</value>
            </agent-parameter>
                    <agent-parameter multi-valued="false">
                <name>ExternalPublicOrgNWPlatformID_DS</name>
                <value>ABC-0cbu0cust12301dcd-D-PCL-XYZ</value>
            </agent-parameter>
        </send-parameters>
    </message>
Run Code Online (Sandbox Code Playgroud)

这是我给出的示例输出,我需要遍历xml中的多个节点并生成输出xml.

我通过将xpath指向源xml的cdata内的节点来使用xslt.但它是空的,因为它不是树形结构格式.

我无法在CDATA中获取xml的X-Path.如果我在xml中删除CDATA,但是xml是从外部系统传入的,它是无法修改的.

我不能使用多个xslts我需要应用单个XSLT.

你能否就此提出建议?

非常感谢期待..

小智 1

The below is the transform for the expected output:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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


  <xsl:template match="message">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>


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


    <xsl:apply-templates select="text()" />
  </xsl:template>
  <xsl:template match="text()[contains(., '&lt;OrgNetworkPlatformID>')]">
    <value>
      <xsl:value-of select="substring-before(substring-after(., '&lt;OrgNetworkPlatformID>'),
              '&lt;/OrgNetworkPlatformID>')"/>
    </value>
  </xsl:template>

</xsl:stylesheet>


The output xml :


<?xml version="1.0" encoding="utf-8"?>
<message channel-id="e01db0aa-b3db-4b6c-a055-7a0d5c1d1f20" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <send-parameters>
    <agent-parameter multi-valued="false">
      <name>Networks</name>
      <value>urn:vcloud:network:b7ccfd5f-cfd7-48eb-9dd6-1989b08d7b86</value>
    </agent-parameter>

  </send-parameters>
</message>
Run Code Online (Sandbox Code Playgroud)

您正在寻找上面的输出 XML 还是其他内容?