【问题标题】:How to preserve white spaces of an xml element in XSLT如何在 XSLT 中保留 xml 元素的空格
【发布时间】: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。”

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

感谢您宝贵的时间

【问题讨论】:

    标签: c# .net xslt


    【解决方案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】:

      【讨论】:

        猜你喜欢
        • 2011-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-09
        • 1970-01-01
        • 1970-01-01
        • 2013-02-03
        • 1970-01-01
        相关资源
        最近更新 更多