我之前提到的question分叉,如何确保example/one/field
和example/three/field
包含在CDATA中而example/two/field
不是?
输入:
<?xml version="1.0"?>
<example>
<one>
<field>CDATA required here</field>
</one>
<two>
<field>No CDATA thanks</field>
</two>
<three>
<field>More CDATA please</field>
</three>
</example>
必填项:
<?xml version="1.0"?>
<example>
<one>
<field><![CDATA[CDATA required here]]></field>
</one>
<two>
<field>No CDATA thanks</field>
</two>
<three>
<field><![CDATA[More CDATA please]]></field>
</three>
</example>
我可以指定<xsl:output cdata-section-elements="field"/>
,但这也会影响example/two/field
。我尝试过像<xsl:output cdata-section-elements="example/one/field example/three/field"/>
这样的路径,但这会产生错误(错误XTSE0280:元素名称无效。无效的QName {example / one / field} )。我哪里错了?
答案 0 :(得分:2)
使用您当前的标记我不认为XSLT有一个干净的方法。您至少需要使用不同的元素名称或不同的名称空间,以允许您和XSLT处理器的序列化程序区分哪些元素作为CDATA部分输出,哪些不能。
或者您需要考虑使用disable-output-escaping,例如。
<xsl:template match="one/field | three/field">
<xsl:copy>
<xsl:text disable-output-escaping="yes"><![CDATA[<![CDATA[]]></xsl:text>
<xsl:value-of select="."/>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</xsl:copy>
</xsl:template>
[编辑] 这是一个完整的样本样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="one/field | three/field">
<xsl:copy>
<xsl:text disable-output-escaping="yes"><![CDATA[<![CDATA[]]></xsl:text>
<xsl:value-of select="."/>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
但请注意,disable-output-escaping是所有XSLT处理器都不支持的可选序列化功能。