使用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> </xsl:text> <!-- 换行分隔 --> <!-- 提取带空格的文本 --> <xsl:value-of select="data/spacingText"/> </xsl:template> </xsl:stylesheet>
如果这个简化版能得到预期结果,再逐步添加你原来XSL里的其他逻辑,就能定位到哪里出问题啦。
内容的提问来源于stack exchange,提问作者WheelsShark
相关产品推荐
相关产品推荐

