Xslt cdata节元素不适用于动态创建的元素
我试图将一些动态创建的元素定义为cdata节,但由于某些原因,它不起作用:Xslt cdata节元素不适用于动态创建的元素,xslt,Xslt,我试图将一些动态创建的元素定义为cdata节,但由于某些原因,它不起作用: <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="no" indent="yes" method="xml" cdata-section-elements="DESCRIPTION2" /> <xsl:strip
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="no" indent="yes" method="xml"
cdata-section-elements="DESCRIPTION2"
/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="/RSS/ITEM/TEST">
<DESCRIPTION2>
<div class="container">
<xsl:if test="NAME != ''">
<div class="test">
<xsl:value-of select="NAME"/>
</div>
</xsl:if>
</div>
</DESCRIPTION2>
</xsl:template>
</xsl:stylesheet>
当然我可以手动添加(
![CDATA[
),但我想知道,如果我将其定义为CDATA节元素,它为什么不起作用。您的内容是格式良好的XHTML,因此在序列化内容时不需要应用CDATA
如果对标记进行转义并构造一个字符串,它将序列化为CDATA:
<xsl:template match="/RSS/ITEM/TEST">
<DESCRIPTION2>
<div class="container">
<xsl:if test="NAME != ''">
<div class="test">
<xsl:value-of select="NAME"/>
</div>
</xsl:if>
</div>
</DESCRIPTION2>
</xsl:template>
div class=“container”>
div class=“测试”>
/div>
/div>
产生:
<DESCRIPTION2><![CDATA[
<div class="container">
<div class="test">
Peter
</div>
</div>
]]></DESCRIPTION2>
彼得
]]>
但既然可以有格式良好的标记,为什么还要生成字符串呢?这让下游的每个人都很痛苦。CDATA序列化发生在指定元素中的文本节点上,如果您将元素放在其中,则不会发生。请注意,假设XSLT 3处理器支持XPath 3.1,则可以使用
serialize
函数将生成的内容序列化为html,然后将其输出为文本节点:
<xsl:template match="/RSS/ITEM/TEST">
<xsl:variable name="html">
<div class="container">
<xsl:if test="NAME != ''">
<div class="test">
<xsl:value-of select="NAME"/>
</div>
</xsl:if>
</div>
</xsl:variable>
<DESCRIPTION2>
<xsl:value-of select="serialize($html, map { 'method' : 'html' })"/>
</DESCRIPTION2>
</xsl:template>
然后将结果作为CDATA部分给出
<DESCRIPTION2><![CDATA[<div class="container">
<div class="test">Peter</div>
</div>]]></DESCRIPTION2>
彼得
]]>
为什么您认为在生成的输出中需要CDATA?@MadsHansen在实际的XML中会有一个HTML代码,我只是简化了问题中的XML。
<DESCRIPTION2><![CDATA[<div class="container">
<div class="test">Peter</div>
</div>]]></DESCRIPTION2>