以下是使用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>
答案 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>
虽然我没有完全看到这个练习的重点,因为输出与输入相同 - 语义和词汇(除了可能的缩进量)。