使用XslCompiledTransform时,在属性之间保留XML元素中的空格

时间:2014-06-25 15:44:55

标签: c# xml xslt xmlreader xslcompiledtransform

我正在使用xsltUri类将XSL-T文件TargetXmlFile应用于XML文件XslCompiledTransform

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>

问题: 如何在&#34;元素&#34;中保留输入XML文件的空格(特别是换行符)。输出XML文件中的标签?我已经尝试了不同的选项,但没有任何方法适用于这种情况。

感谢任何提示!

2 个答案:

答案 0 :(得分:2)

这与XSLT无关。 XML文档模型中不存在您引用的空白,即使使用xml:space="preserve",它也不会对符合条件的XML处理器产生重要影响。在DOM中没有它的位置,它将被读者跳过;因此,无法将其复制到作者。您必须使用自定义代码(换句话说,不使用XmlWriter)发出XML。

答案 1 :(得分:1)

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

  1. 就XML文档而言,它并不存在。
  2. 就XML解析器而言,它被忽略,因为1)。唯一的例外是在<之后立即空格是非法的。
  3. 就XML序列化程序而言,它们可以做他们想要的,因为1)和2)。大多数(如果不是全部)将使用单个空格字符将属性彼此分开。
  4. 因此...

    • 不要尝试构建依赖于XML源代码布局的应用程序。
    • 由于XML中的这种源代码布局在技术上是无关紧要的...克服你的强迫症。 ;)