首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CDATA标记仅在调用apply-templates时应用于XML输出

CDATA标记仅在调用apply-templates时应用于XML输出
EN

Stack Overflow用户
提问于 2019-03-04 08:30:23
回答 1查看 209关注 0票数 0

我有一个XML输入,我试图在其中保存CDATA标记。我使用了一个简单的样式表,但是由于某些我无法理解的原因,CDATA标签只有在我添加应用模板并在模板匹配中放入一些内容时才会出现。

这是我的XML输入。ns1:entry中的所有内容都将有一个CDATA标记。基本上,我希望我的输出与输入完全相同。我使用DataPower实现消息安全性,并且它删除了CDATA,所以这个XSLT是为了确保它被保留。

代码语言:javascript
复制
<?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>

样式表:

代码语言:javascript
复制
<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的消息(不出所料)。

代码语言:javascript
复制
<xsl:template match="text()"/>1</xsl:template>

如果没有执行某些功能的模板匹配,我不知道如何让样式表保留CDATA标记。任何建议都将不胜感激。我在这方面已经做了太长时间了,现在我在兜圈子。

DataPower XI52 7.6.0.6

EN

回答 1

Stack Overflow用户

发布于 2019-03-04 08:50:24

这样如何:

XSLT 1.0

代码语言:javascript
复制
<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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54975203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档