输入XML:
<element attr="a b
c
d"/>XSL:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="xml" indent="yes"/>
</xsl:stylesheet>结果:<element attr="a b c d"/>
使用Saxon 9.9。
为什么马车的退货被拿走了?XML规范中有什么东西说它们与属性无关吗?有什么办法可以解决这些问题吗?
发布于 2020-07-28 20:24:02
我想你看到的是属性值归一化。所发生的是所有的换行符都被标准化为#xA。然后,所有这些都归一化为一个空格(#x20)。
这是基于规范中的这些语句(链接在上面):
所有的换行符在输入到#xA时都必须标准化,如2.11行尾处理中所描述的那样,因此该算法的其余部分都是以这种方式对文本进行规范化操作的。
和
对于空白字符(#x20、#xD、#xA、#x9),将一个空格字符(#x20)附加到规范化值中。
我能想到的唯一“解决办法”是对XML进行预处理,用字符引用替换换行符。这是基于:
注意,如果未规范化属性值包含对空格(#x20)以外的空白字符的引用,则规范化值包含引用的字符本身(#xD、#xA或#x9)。
如果输出属性值,仍然会得到字符引用,但如果在元素或文本中输出值,则会得到实际的换行符.
替换换行符:
<element attr="a b 
 c
 
 d"/>XSLT
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/*">
<test attr="{@attr}">
<xsl:value-of select="@attr"/>
</test>
</xsl:template>
</xsl:stylesheet>输出
<test attr="a b 
 c
 
 d">a b
c
d</test>https://stackoverflow.com/questions/63141401
复制相似问题