You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 18:05:29