Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt cdata节元素不适用于动态创建的元素_Xslt - Fatal编程技术网

Xslt 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

我试图将一些动态创建的元素定义为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>


当然我可以手动添加(
![CDATA[
),但我想知道,如果我将其定义为CDATA节元素,它为什么不起作用。

您的内容是格式良好的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>

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>