0

我正在使用该类将 XSL-T 文件xsltUri应用于 XML 文件:TargetXmlFileXslCompiledTransform

XslCompiledTransform xslTransform = new XslCompiledTransform(false);
xslTransform.Load(xsltUri);

using (var outStream = new MemoryStream())
{
    var writer = new StreamWriter(outStream, new UTF8Encoding());
    using (var reader = new XmlTextReader(TargetXmlFileName)
    {
        WhitespaceHandling = WhitespaceHandling.All,
        DtdProcessing = DtdProcessing.Ignore
    })
    {
        xslTransform.Transform(reader, xsltArguments, writer);
    }

    outStream.Position = 0;
    using (FileStream outFile = new FileStream(outputFileName, FileMode.Create))
    {
        outStream.CopyTo(outFile);
    }
}

输入 XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <element
    id="1"
    attr1="value11"
    attr2="value12"/>
  <element    id="2"    attr1="value21"    attr2="value22"/>
</root>

输入 XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

  <xsl:template match="//element[@id='2']/@attr1">
    <xsl:attribute name="attr1">
      <xsl:value-of select="'newvalue21'"/>
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>

实际输出 XML:

<?xml version="1.0" encoding="utf-8"?><root>
  <element id="1" attr1="value11" attr2="value12" />
  <element id="2" attr1="newvalue21" attr2="value22" />
</root>

所需的输出 XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <element
    id="1"
    attr1="value11"
    attr2="value12"/>
  <element    id="2"    attr1="newvalue21"    attr2="value22"/>
</root>

问题:如何在输出 XML 文件的“元素”标签内保留输入 XML 文件的空格(尤其是换行符)?我尝试了不同的选项,但在这种情况下没有任何效果。

感谢您的任何提示!

4

2 回答 2

2

这与 XSLT 无关。您所指的空格在 XML 文档模型中不存在,并且对于符合标准的 XML 处理器而言,即使使用xml:space="preserve". DOM中没有它的位置,读者会略过;因此,无法将其复制给作者。您必须使用自定义代码(换句话说,不是使用XmlWriter)来发出 XML。

于 2014-06-25T16:12:34.463 回答
1

标记的内部格式(属性之间的空格)在 XML 中是完全短暂的。

  1. 就 XML 文档而言,它不存在。
  2. 就 XML 解析器而言,它被忽略了,因为 1)。唯一的例外是紧跟在 . 之后的空格是非法的<
  3. 就 XML 序列化程序而言,它们可以为所欲为,因为 1) 和 2)。大多数(如果不是全部)将使用单个空格字符来分隔属性。

所以...

  • 不要试图构建依赖于 XML 源代码布局的应用程序。
  • 由于 XML 中的这种源代码布局在技术上是无关紧要的……克服你的强迫症。;)
于 2014-06-25T16:20:46.977 回答