XSLT 2.0处理无效节点混合文本和cdata

时间:2010-11-16 17:27:28

标签: xslt cdata xslt-2.0

我需要解析以下节点:

  <media:keywords>keyword1,keyword2<![CDATA[keyword3]]></media:keywords>

成一个有效的字符串,最好是“keyword1,keyword2,keyword3”,但我会决定完全删除cdata。

尝试访问该节点会给我提供文本“keyword1,keyword2keyword3”,我无法分辨CDATA的开始位置。

原始xml(mRSS Feed的简化版)

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
     <item>
      <media:keywords>keyword1,keyword2<![CDATA[keyword3]]></media:keywords>
    </item>
  </channel>
</rss>

xsl(简化):

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:media="http://search.yahoo.com/mrss/" exclude-result-prefixes="xs xsi fn">
    <xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="yes"/>
    <xsl:template match="/">
        <test>
            <xsl:variable name="items" select="/rss/channel/item"/>
            <xsl:for-each select="$items">
                <xsl:variable name="mediakw" select="media:keywords"/>
                <xsl:element name="mediaKeyWords">
                        <xsl:value-of select="$mediakw"/>
                </xsl:element>
            </xsl:for-each>
        </test>
    </xsl:template>
</xsl:stylesheet>

和输出:

<test xmlns:media="http://search.yahoo.com/mrss/"><mediaKeyWords>keyword1,keyword2keyword3</mediaKeyWords></test>

非常感谢!

3 个答案:

答案 0 :(得分:2)

当XSLT处理器看到文本时,CDATA就消失了。您无法看到传入的CDATA,并且几乎无法控制输出CDATA的生成方式(给定标记的全部或全部内容)。

答案 1 :(得分:2)

XML和XSLT无法帮助您

XSLT使用INFOSET模型,其中没有任何内容作为“CDATA节点”,只有一个text()节点:

“关键字1,keyword2keyword3”

需要更正XML文档并在子字符串"keyword2""keyword3"

之间插入逗号

使用DOM处理CDATA DOM节点的一个解决方案是,然后才启动XSLT转换。

答案 2 :(得分:2)

无法在标准XSLT中完成。

您收到的输入XML

<media:keywords>keyword1,keyword2<![CDATA[keyword3]]></media:keywords>

无法区分(对XSLT)
<media:keywords>keyword1,keyword2keyword3</media:keywords>

因为CDATA标记只是一种逃避其中数据的方法。在这种情况下,实际上没有特殊标记可以逃脱,因此CDATA恰好是无操作。但是,XSLT无法知道最初使用CDATA表达的数据,使用字符实体表达的数据等。

解决方案是告诉谁提供此XML,他们需要在keyword2和keyword3之间放置分隔符。