首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在XSLT中保留属性新行

在XSLT中保留属性新行
EN

Stack Overflow用户
提问于 2020-07-28 19:23:40
回答 1查看 85关注 0票数 1

输入XML:

代码语言:javascript
复制
<element attr="a  b  
c

d"/>

XSL:

代码语言:javascript
复制
<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规范中有什么东西说它们与属性无关吗?有什么办法可以解决这些问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-28 20:24:02

我想你看到的是属性值归一化。所发生的是所有的换行符都被标准化为#xA。然后,所有这些都归一化为一个空格(#x20)。

这是基于规范中的这些语句(链接在上面):

所有的换行符在输入到#xA时都必须标准化,如2.11行尾处理中所描述的那样,因此该算法的其余部分都是以这种方式对文本进行规范化操作的。

对于空白字符(#x20、#xD、#xA、#x9),将一个空格字符(#x20)附加到规范化值中。

我能想到的唯一“解决办法”是对XML进行预处理,用字符引用替换换行符。这是基于:

注意,如果未规范化属性值包含对空格(#x20)以外的空白字符的引用,则规范化值包含引用的字符本身(#xD、#xA或#x9)。

如果输出属性值,仍然会得到字符引用,但如果在元素或文本中输出值,则会得到实际的换行符.

替换换行符:

代码语言:javascript
复制
<element attr="a  b  &#xA;    c&#xA;    &#xA;    d"/>

XSLT

代码语言:javascript
复制
<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>

输出

代码语言:javascript
复制
<test attr="a  b  &#xA;    c&#xA;    &#xA;    d">a  b  
    c
    
    d</test>
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63141401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档