在CDATA中包含一些字段,但不包含同名的其他字段

时间:2012-05-28 09:21:45

标签: xslt

我之前提到的question分叉,如何确保example/one/fieldexample/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} )。我哪里错了?

1 个答案:

答案 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">]]&gt;</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">]]&gt;</xsl:text>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

但请注意,disable-output-escaping是所有XSLT处理器都不支持的可选序列化功能。