cdata-section-elements不适用于动态创建的元素

时间:2018-02-19 17:37:26

标签: 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-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>

测试XML:

<?xml version="1.0" encoding="UTF-8"?>
<RSS>
   <ITEM>
      <CODE>41,000</CODE>
      <TEST>
          <NAME><p>HTML code</p></NAME>
      </TEST>
   </ITEM>
</RSS>

Live test

当然我可以手动添加(<xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>),但我想知道它为什么不起作用如果我将其定义为cdata-section-elements。

2 个答案:

答案 0 :(得分:2)

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>

http://xsltfiddle.liberty-development.net/948Fn5i/1然后将结果作为CDATA部分

      <DESCRIPTION2><![CDATA[<div class="container">
   <div class="test">Peter</div>
</div>]]></DESCRIPTION2>

答案 1 :(得分:1)

您的内容是格式正确的XHTML,因此在序列化内容时不需要应用CDATA。

如果您转义了标记并构造了一个字符串,它将序列化为CDATA:

<xsl:template match="/RSS/ITEM/TEST">
    <DESCRIPTION2>
        &lt;div class="container">  
            <xsl:if test="NAME != ''">
                &lt;div class="test">
                    <xsl:value-of select="NAME"/>
                &lt;/div>
            </xsl:if>
        &lt;/div>       
    </DESCRIPTION2>    
</xsl:template>

产地:

  <DESCRIPTION2><![CDATA[
        <div class="container">  

                <div class="test">
                    Peter
                </div>

        </div>       
    ]]></DESCRIPTION2>

但是,为什么要在生成格式良好的标记时生成字符串?它让下游的每个人都感到痛苦。