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(., '<OrgNetworkPlatformID>')]">
<value>
<xsl:value-of select="substring-before(substring-after(., '<OrgNetworkPlatformID>'),
'</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 还是其他内容?