CDATA 不幸的是,在这里说起来模棱两可。有"CDATA Sections"和"CDATA Attribute Type"。
您的属性值可以是具有“CDATA 属性类型”的 CDATA 类型。
这是一个包含“CDATA Section”的xml(aka.CDSect):
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<elemke>
<![CDATA[
foo
]]>
</elemke>
这是一个包含“CDATA Attribute Type”的xml(如AttType):
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE elemke [
<!ATTLIST brush wood CDATA #REQUIRED>
]>
<elemke>
<brush wood="guy
threep"/>
</elemke>
您不能对属性值使用“CDATA 部分”:错误:<brush wood=<![CDATA[foo]]>/>
您可以为您的属性类型使用“CDATA 属性类型”,我认为这实际上是通常情况下发生的情况,而你的属性值 is 实际上是一个 CDATA:对于像 <brush wood="guy&#xA;threep"/> 这样的元素,在 .xml 文件的原始二进制字节串中,你有 guy&#xA;threep处理文件时,内存中的属性值将为
guy
threep
您的问题可能在于 1) 生成正确的 xml 文件和 2) 配置“xml 处理器”以生成所需的输出。
例如,如果您手动将原始二进制文件作为 xml 编写,您需要将这些转义放在原始文件的属性值部分中,就像我在这里写的 <brush wood="guy&#xA;threep"/> , 而不是 <brush wood="guy (换行符) threep"/>
那么解析实际上会给你一个换行符,我已经用处理器试过了。
您可以使用像撒克逊这样的处理器进行尝试,或者像浏览器一样进行穷人的实验,在 firefox 中打开 xml 并将值复制到文本编辑器 - firefox 显示 换行符作为空格,但将字符串复制到文本编辑器会显示换行符。 (可能使用更适合的处理器,您可以立即保存直接输出。)
现在您需要做的“唯一”事情是确保正确处理此 CDATA。例如,如果你有一个 XSL 样式表,它会生成一个 html,你可以使用类似 .xsl 这样的 xml:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template name="split">
<xsl:param name="list" select="''" />
<xsl:param name="separator" select="'
'" />
<xsl:if test="not($list = '' or $separator = '')">
<xsl:variable name="head" select="substring-before(concat($list, $separator), $separator)" />
<xsl:variable name="tail" select="substring-after($list, $separator)" />
<xsl:value-of select="$head"/>
<br/><xsl:text>
</xsl:text>
<xsl:call-template name="split">
<xsl:with-param name="list" select="$tail" />
<xsl:with-param name="separator" select="$separator" />
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template match="brush">
<html>
<xsl:call-template name="split">
<xsl:with-param name="list" select="@wood"/>
</xsl:call-template>
</html>
</xsl:template>
</xsl:stylesheet>
在浏览器或像撒克逊这样的处理器中使用 java -jar saxon9he.jar -s:eg2.xml -xsl:eg2.xsl -o:eg2.html saxon home edition 9.5 会产生类似 html 的东西:
<html>guy<br>
threep<br>
</html>
在浏览器中看起来像这样:
guy
threep
这里我使用递归模板'split'from Tomalak,感谢Mads Hansen,因为我的目标处理器既不支持string-join也不支持tokenize,它们仅支持2.0版。