6

単一の 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>

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>

これは、出力 xml をトラバースして生成する必要がある xml 内に複数のノードがあることを示すサンプル出力です。

ソースxmlのcdata内のノードにxpathを向けることで、xsltを使用しています。しかし、ツリー構造形式ではなかったため、空になっています。

CDATA 内の xml の X-Path を取得できません。xml で CDATA を削除するとうまくいきますが、xml は変更できない外部システムから来ています。

単一の XSLT を適用する必要がある複数の xslt を使用できません。

これについて私に提案してください。

期待に感謝します..

4

3 に答える 3

3

CDATAは「文字データ」を意味し、含まれるテキストにマークアップが含まれていないことを示すために適切に使用されます。マークアップを含むテキストを折り返すために誤用された場合、唯一の答えは、テキストコンテンツを抽出し、それを解析の第2フェーズにかけることです。XSLT 1.0および2.0には、字句XMLを解析できる関数は含まれていませんが、XSLT3.0には含まれています。XSLT 1.0に固執している場合は、データをパーサーに渡し、結果のノードツリーのルートを取得する独自の拡張関数を作成する必要があります。

于 2013-01-24T23:43:32.663 に答える
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>

上記の出力 XML は、探しているものですか、それとも別のものですか?

于 2013-01-24T21:00:55.600 に答える