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

如何使用XSLT检测XML<description>元素是否以<![CDATA[开头

问题原因

XML解析器加载文档时会自动剥离<![CDATA[和]]>标记,将CDATA包裹的内容直接转换为普通文本节点,XSLT处理时拿到的是已经剥离标记后的内容,所以永远匹配不到<![CDATA[前缀。

解决方案

方案1:根据实际场景判断(推荐)

绝大多数RSS Feed用CDATA包裹<description>都是因为内容包含HTML标签,你可以直接判断内容是否包含HTML标签字符来决定是否渲染,代码修改如下:

<xsl:if test="not(contains(description, '&lt;'))">
  <p>
    <xsl:value-of select="description" />
  </p>
</xsl:if>

方案2:直接检测原始XML的CDATA标记

如果你确实需要严格匹配原始XML中的CDATA标记,可以用XSLT 3.0的unparsed-text()函数读取原始RSS文件的未解析内容,手动匹配对应<description>节点的原始字符串:

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">
  <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes" />
  <!-- 读取原始RSS文件的未解析文本 -->
  <xsl:variable name="raw-feed" select="unparsed-text(static-base-uri())" />
  <xsl:template match="/">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head></head>
      <body>
        <xsl:for-each select="/rss/channel/item">
          <!-- 获取当前item的title和link用于定位原始内容 -->
          <xsl:variable name="current-title" select="normalize-space(title)" />
          <xsl:variable name="current-link" select="normalize-space(link)" />
          <!-- 匹配原始内容中当前item对应的description节点,可根据自身RSS的缩进、节点顺序调整匹配规则 -->
          <xsl:variable name="item-part" select="substring-after($raw-feed, concat('&lt;title&gt;', $current-title, '&lt;/title&gt;&lt;link&gt;', $current-link, '&lt;/link&gt;'))" />
          <xsl:variable name="desc-part" select="substring-after($item-part, '&lt;description&gt;')" />
          <xsl:variable name="desc-prefix" select="substring(normalize-space($desc-part), 1, 9)" />
          <!-- 不是CDATA开头则渲染 -->
          <xsl:if test="$desc-prefix != '&lt;![CDATA['">
            <p>
              <xsl:value-of select="description" />
            </p>
          </xsl:if>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:09:02