如何防止添加空的CDATA元素?

时间:2016-10-11 16:21:12

标签: xml xslt

以下是使用XSLT和输入/输出XML。输出XML包含空的CDATA元素。如何防止添加它而不排除cdata-section-elements? XSLT

    <?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output cdata-section-elements="first second" indent="yes"/>
    <xsl:strip-space elements="first second"/>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

输入

    <?xml version="1.0" encoding="UTF-8"?>
<top>
    <first>
        <second/>
    </first>
    <first>
        <second><![CDATA[! Please note...]]></second>
    </first>
</top>

使用条带空间输出

    <?xml version="1.0" encoding="UTF-8"?>
<top>
    <first>
      <second/>
   </first>
    <first>
      <second><![CDATA[! Please note...]]></second>
   </first>
</top>

没有条带空间的输出

<?xml version="1.0" encoding="UTF-8"?>
<top>
    <first><![CDATA[
        ]]><second/><![CDATA[
    ]]></first>
    <first><![CDATA[
        ]]><second><![CDATA[! Please note...]]></second><![CDATA[
    ]]></first>
</top>

2 个答案:

答案 0 :(得分:1)

解决方案的关键字是function strip-space。继续:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:output cdata-section-elements="first"/>
    <xsl:strip-space elements="first second"/>
    ...

准确地说,这两个节点之间有空白文本节点:

<first>
    <second/>

CDATA不能忽略这些空格,否则会改变内容。所以你必须命令处理器,如何处理这些文本节点。

第二种可能的解决方案:您通过模板处理空白文本并将其删除:

<xsl:template match="first/text()[not(normalize-space())]"/>

答案 1 :(得分:0)

我建议你这样试试:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" cdata-section-elements="second"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

虽然我没有完全看到这个练习的重点,因为输出与输入相同 - 语义和词汇(除了可能的缩进量)。