如何在 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-space
和xsl:preserve-space
中所说的任何内容。相反,这里的问题是xsl:strip-space
的Microsoft System.Xml.Xsl
实现中的限制-@RomanSS 引用的问题中解释了(不是特别好)的限制。
基本上,如果您提供一个预先构建的 DOM 树作为 XSLT 处理器的输入,那么 XSLT 规范中去除空白文本节点的要求是相当具有挑战性的,看起来微软已经通过强加来应对挑战一个限制。满足此要求的其他方法包括:
(a) 原位修改提供的 DOM 树以删除空白文本节点
(b) 将提供的 DOM 树包装在一个包装器中,使导航树时空白文本节点不可见
(c) 将提供的 DOM 树批量复制到一个新树中,其中空白文本节点被省略。
撒克逊人在不同的情况下使用所有三种策略;它们都很贵。在解析文档和构建树的同时进行空格剥离会效率更高,这是 Microsoft 通过施加限制强制您执行的操作。
但这一切都与您的问题无关。如果你去掉 xsl:strip-space
和 xsl:preserve-space
声明,“test”周围的空白将被保留为你想要的。 xsl:strip-space
和 xsl: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 元素的空格的主要内容,如果未能解决你的问题,请参考以下文章