我有一个XML输入,我试图保持CDATA标签。我有一个简单的样式表,我正在使用,但由于某些原因,我无法弄清楚,CDATA标签只出现,如果我添加apply-templates并放入一些东西我的模板匹配。
这是我的XML输入。 ns1:entry中的所有内容都将具有CDATA标记。基本上我希望我的输出与输入完全相同。我正在使用DataPower来保护消息安全并且正在删除CDATA,所以这个XSLT确保它被保留。
<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<User xmlns="http://google.com/schema" xmlns:ns1="http://google.com/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns1:user xmlns:ns1="http://google.com/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns1:userId>12345</ns1:userId>
<ns1:extraMap ns1:size="15" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns1:entry ns1:key="devicetype" xsi:type="xsd:string">
<![CDATA[iPhone10,6]]>
</ns1:entry>
<ns1:entry ns1:key="longitude" xsi:type="xsd:string">
<![CDATA[-70.000000]]>
</ns1:entry>
<ns1:entry ns1:key="latitude" xsi:type="xsd:string">
<![CDATA[40.000000]]>
</ns1:entry>
<ns1:entry ns1:key="osname" xsi:type="xsd:string">
<![CDATA[iOS]]>
</ns1:entry>
</ns1:extraMap>
<ns1:profile-status>
<ns1:enum-class>xxxxxx</ns1:enum-class>
<ns1:enum-value>Active</ns1:enum-value>
</ns1:profile-status>
</ns1:user>
</User>
</soapenv:Body>
</soapenv:Envelope>
样式表:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="http://google.com/schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:str="http://exslt.org/strings"
version="1.0" exclude-result-prefixes="dp ns1 xsi">
<xsl:output method="xml" encoding="utf-8" version="1.0"
cdata-section-elements="ns1:entry ns1:userId" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy-of select="."/>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="text()"/>
使用该样式表,将删除CDATA标记。如果我将模板匹配更改为以下内容,则会获得CDATA标记,但也会显示一条消息,后跟一堆1(如预期的那样)。
<xsl:template match="text()"/>1</xsl:template>
我无法弄清楚如何让样式表保留CDATA标签,而没有执行某些功能的模板匹配。任何建议将不胜感激。我已经这么久了,我现在正在圈子里。
DataPower XI52 7.6.0.6
怎么样:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="http://google.com/schema">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" cdata-section-elements="ns1:entry" />
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
附:删除错误和冗余部分后,您自己的版本应该也可以正常工作 - 请参阅:http://xsltransform.net/93wkLHY