我有一个XML输入,我试图在其中保存CDATA标记。我使用了一个简单的样式表,但是由于某些我无法理解的原因,CDATA标签只有在我添加应用模板并在模板匹配中放入一些内容时才会出现。
这是我的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
发布于 2019-03-04 08:50:24
这样如何:
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
https://stackoverflow.com/questions/54975203
复制相似问题