如何在 XSLT 中保留 xml 元素的空格

Posted

技术标签:

【中文标题】如何在 XSLT 中保留 xml 元素的空格【英文标题】:How to preserve white spaces of an xml element in XSLT 【发布时间】:2019-03-13 19:23:37 【问题描述】:

当我将一个 xml 文档转换为另一个 xml 文档时,我想保留空格。

输入 XML:

<Item>
    <type>4</typr>
    <name>         test      </name>
</Item>

XSLT:

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:preserve-space elements="name"/>

    <xsl:template match="Item">
       <xsl:element name="Itemtransformed">
           <xsl:element name="itemname"><xsl:value-of select="//name></xsl:element>
       </xsl:element>
    </xsl:template>
</xsl:stylesheet>

预期输出:

<Itemtransformed>
    <itemname>         test      </itemname>
</Itemtransformed>

当我尝试使用 System.Xml.Xsl.XslCompiledTransform.Transform(IXPathNavigable input, XsltArgumentList arguments, XmlWriter results) 在 .Net 中对其进行转换时,出现以下错误

“无法从已加载的输入文档中去除空白。将输入文档提供为 XmlReader。”

任何想法如何修复它或任何其他可能的方式来保留空白。

感谢您宝贵的时间

【问题讨论】:

【参考方案1】:

问题与“test”周围的前导和尾随空格无关,XSLT 将自动保留您在xsl:strip-spacexsl:preserve-space 中所说的任何内容。相反,这里的问题是xsl:strip-space 的Microsoft System.Xml.Xsl 实现中的限制-@RomanSS 引用的问题中解释了(不是特别好)的限制。

基本上,如果您提供一个预先构建的 DOM 树作为 XSLT 处理器的输入,那么 XSLT 规范中去除空白文本节点的要求是相当具有挑战性的,看起来微软已经通过强加来应对挑战一个限制。满足此要求的其他方法包括:

(a) 原位修改提供的 DOM 树以删除空白文本节点

(b) 将提供的 DOM 树包装在一个包装器中,使导航树时空白文本节点不可见

(c) 将提供的 DOM 树批量复制到一个新树中,其中空白文本节点被省略。

撒克逊人在不同的情况下使用所有三种策略;它们都很贵。在解析文档和构建树的同时进行空格剥离会效率更高,这是 Microsoft 通过施加限制强制您执行的操作。

但这一切都与您的问题无关。如果你去掉 xsl:strip-spacexsl:preserve-space 声明,“test”周围的空白将被保留为你想要的。 xsl:strip-spacexsl:preserve-space 声明仅影响完全由空格组成的文本节点。

【讨论】:

【参考方案2】:

也许这就是你要找的。显示的代码中似乎不存在问题。 White space cannot be stripped from input documents that have already been loaded. Provide the input document as an XmlReader instead

【讨论】:

以上是关于如何在 XSLT 中保留 xml 元素的空格的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 xslt 获取与复杂条件匹配的所有 xml 项的计数并在终止语句中使用它?

如何使用 XSLT 从 XML 中删除名称空间

如何在 xslt 中添加空格并将记录限制为 300 个字符

使用Java解析时如何在文档元素之前保留空格?

如何使用 XSLT 从 XML 中删除元素标记

如何使用 XSLT 在 xml 文件中查找元素并将其放置在另一个标记中?