我需要解析以下节点:
<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>
非常感谢!
答案 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之间放置分隔符。