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

使用XSL提取XML中CDATA值并保留空格的技术求助

解决XML + XSL提取CDATA与保留空格问题的思路

嘿,我来帮你梳理下搞定这个问题的具体思路,一步步来排查:

1. 先明确你的XML结构与当前XSL代码

首先得确认你的XML里CDATA和目标文本节点的具体结构,举个类似的示例(方便后续说明):

<data>
  <cdataContent><![CDATA[[Slement OF The Late Eleanor Sefton]]]></cdataContent>
  <spacingText>HEY (with spacing) YOU</spacingText>
</data>

同时回忆下你当前XSL里处理这两个节点的代码——很多时候问题出在不小心用了normalize-space()或者输出设置不对,先把这部分理清楚。

2. 正确提取CDATA内容的方法

其实CDATA在XSL里不需要特殊处理,它和普通文本节点的读取逻辑是一样的:

  • 直接用<xsl:value-of select="你的CDATA所在元素节点"/>就能获取完整的CDATA内容,包括里面的方括号。
  • 注意不要给这个节点加normalize-space(),除非你刻意想去掉多余空格,这里保留原始内容就直接取值即可。

3. 保留文本间空格的核心要点

你提到的HEY (with spacing) YOU空格丢失,大概率是XSL的默认空格处理导致的——XSL默认会把连续的空格、换行、制表符合并成一个空格。解决方法有两个:

  • 方法一:避免空格归一化
    直接选取文本节点,不要使用normalize-space(),比如:
    <xsl:template match="spacingText">
      <xsl:value-of select="."/>
    </xsl:template>
    
  • 方法二:输出时保留原始空格
    如果是输出纯文本,在<xsl:output>里设置method="text"和indent="no";如果是输出HTML,可以把这段文本放在<pre>标签里,强制保留空格格式:
    <xsl:template match="spacingText">
      <pre><xsl:value-of select="."/></pre>
    </xsl:template>
    

4. 调试小技巧

先简化你的XSL代码,只处理这两个目标节点,看看输出结果:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" indent="no"/>
  <xsl:template match="/">
    <!-- 提取CDATA内容 -->
    <xsl:value-of select="data/cdataContent"/>
    <xsl:text>&#10;</xsl:text> <!-- 换行分隔 -->
    <!-- 提取带空格的文本 -->
    <xsl:value-of select="data/spacingText"/>
  </xsl:template>
</xsl:stylesheet>

如果这个简化版能得到预期结果,再逐步添加你原来XSL里的其他逻辑,就能定位到哪里出问题啦。

内容的提问来源于stack exchange,提问作者WheelsShark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:11:00