如何用XSLT移除CDATA值为空的<text>元素?
问题描述
我刚接触XSLT,对其理解较为困难。我希望实现移除XML中所有CDATA值为空的<text>元素。
我的XML结构如下:
<description> <internet> <texts_short> <text locale="de"><![CDATA[]]></text> <text locale="en"><![CDATA[EXF/RETAIL]]></text> </texts_short> <texts_long> <text locale="de"><![CDATA[]]></text> </texts_long> </internet> <vehicle> <texts_short/> <texts_long> <text locale="en"><![CDATA[Backend Functions Bundle]]></text> </texts_long> <texts_text2speech> <text locale="de"><![CDATA[]]></text> </texts_text2speech> </vehicle> </description>
我已编写了如下XSLT代码,但它会无条件移除所有<text>元素:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="text"/> </xsl:stylesheet>
请问如何修改该代码,使其仅移除CDATA值为空的<text>元素,保留包含“EXF/RETAIL”和“Backend Functions Bundle”的元素?
解决方案
你只需要修改匹配<text>元素的模板,让它仅匹配CDATA内容为空的<text>元素即可。在XSLT中,CDATA段的内容会被当作普通文本节点处理,所以可以通过判断文本节点的内容是否为空来筛选。
修改后的XSLT代码如下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:strip-space elements="*"/> <!-- 身份模板:复制所有节点和属性,默认保留 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 仅匹配内容为空的<text>元素,不进行复制(即移除) --> <xsl:template match="text[normalize-space(text()) = '']"/> </xsl:stylesheet>
代码说明
normalize-space(text()) = '':这个条件会先去除文本内容的前后空白字符,再判断是否为空。既能处理完全空的CDATA(<![CDATA[]]>),也能处理包含空白字符的空CDATA(比如<![CDATA[ ]]>)。- 如果只需要严格匹配完全空的CDATA(不含任何字符,包括空格),可以简化为
text[text() = '']。
转换后的结果
运行修改后的XSLT,会得到以下XML:空CDATA的<text>元素已被移除,内容不为空的<text>被保留:
<description> <internet> <texts_short> <text locale="en">EXF/RETAIL</text> </texts_short> <texts_long/> </internet> <vehicle> <texts_short/> <texts_long> <text locale="en">Backend Functions Bundle</text> </texts_long> <texts_text2speech/> </vehicle> </description>
内容的提问来源于stack exchange,提问作者P4tR
相关产品推荐
相关产品推荐

