2015-03-19 120 views
2

使用XSLT编译转换时我无法完全获得输出到格式,它总是会删除所有空格,并且不是人类可读形式。XSLTCompiled转换不遵守文本文件的XSLT格式化

但是如果我运行相同的通过Visual Studio XSLT转换调试输出整齐indented.Here是我的代码是什么样子:

XDocument xDoc = XDocument.Load(_xmlFilePath, LoadOptions.PreserveWhitespace); 
var xslDoc = new XmlDocument(); 
xslDoc.Load(_xsltFilePath); 
xslDoc.PreserveWhitespace = true; 
using (Stream outputFile = File.Create(_outputFileName)) 
{ 
    XsltArgumentList xsltParameter = null; 
    StringReader tr = new StringReader(xslDoc.OuterXml); 
    XmlReader xr = new XmlTextReader(tr); 
    XslCompiledTransform transform = new XslCompiledTransform(); 
    XsltSettings setting = new XsltSettings(); 

    setting.EnableScript = true; 
    transform.Load(xr, setting, new XmlUrlResolver()); 
    transform.Transform(xDoc.CreateReader(), xsltParameter, outputFile); 
} 

变换将创建一个文本文件,什么是Visual Studio的XSLT调试器做的不同,它保留输出格式?

我已经采取了看看这个链接:XSLT Transform not indenting properly

这并不适用于我,因为我输出的文本。我应该使用Stream以外的东西吗?

我的样品XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
<xsl:output method="text" encoding="UTF-8"/> 

<xsl:template match="/"> 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="root"> 
    <xsl:text>{Start:</xsl:text> 
    <xsl:text disable-output-escaping="yes">&#xD;</xsl:text> 
    <xsl:value-of select="Child1"/> 
    <xsl:text disable-output-escaping="yes">&#xD;</xsl:text> 
    <xsl:value-of select="Child2"/> 
    <xsl:text disable-output-escaping="yes">&#xD;</xsl:text> 
    <xsl:text>End:}</xsl:text> 
</xsl:template> 

<?xml version="1.0" encoding="utf-8"?> 
    <root> 
    <Child1>Value1</Child1> 
    <Child2>value2</Child2> 
    </root> 

预期输出:

{Start: 
Value1 
value2 
End:} 

输出用XSLT变换编译: {Start:Value1value2End:}

Visual Studio XSLT调试器为我提供了预期的输出格式,但XSLT编译变换会去除所有空格和新行。

+0

请更清楚地陈述你的问题。请准确解释您现在得到的输出结果,以及您想要的输出结果,包括每种输出的实际示例?请提供[一个很好的,_minimal_,_complete_代码示例](http://stackoverflow.com/help/mcve),清楚地说明您的问题。 – 2015-03-19 11:37:15

+0

添加我的示例让我知道如果您需要其他任何东西 – user3313541 2015-03-19 13:56:46

+0

当您使用' '作为线端时会发生什么? Windows使用CR/LF作为线端,而不仅仅是一个CR。有些应用程序可能只接受一个CR或者只接受一个LF。 – 2015-03-19 14:05:50

回答

2

不幸的是,这仍然不是完整的代码示例。请阅读我之前提供的链接,了解我的意思。

这就是说,经过一番努力,我能够采取零碎和创造一个单一的,独立的代码示例。我能够验证您的担忧,我可以通过将disable-output-escaping(不需要)替换为需要的xml:space="preserve"来解决问题。

请注意,XSL转换的一部分是首先生成一个表示您的输出的XML图。只有在完成之后,才会创建实际输出。在这个过程中,独立的空白将从文档中删除。通过添加xml:space="preserve",您可以告诉处理代码不要删除那个独立的空白。

这里是一个版本的XSL的的作品,你想要的方式:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output method="text" encoding="UTF-8"/> 

    <xsl:template match="/"> 
     <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="root"> 
     <xsl:text>{Start:</xsl:text> 
     <xsl:text xml:space="preserve">&#xA;</xsl:text> 
     <xsl:value-of select="Child1"/> 
     <xsl:text xml:space="preserve">&#xA;</xsl:text> 
     <xsl:value-of select="Child2"/> 
     <xsl:text xml:space="preserve">&#xA;</xsl:text> 
     <xsl:text>End:}</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

注:我不得不添加</xsl:stylesheet>结束标记

  • 我改变了CR实体

    • &#xD; LF实体&#xA;。它也适用于回车的方式,但我认为从可读性的角度来看,换行更“便携”。
    • 在上面的示例中,我将xml:space="preserve"应用于每个仅包含空格的xsl:text元素。这确保处理器不会删除这些元素。

    这是最后一点的权衡。您会注意到,这意味着您必须在每个要保留空白的节点上指定该属性。另一种,在XSL的可读性为代价的,是对属性适用于整个样式表:

    <?xml version="1.0" encoding="utf-8"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
         xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" xml:space="preserve"> 
        <xsl:output method="text" encoding="UTF-8"/> 
    
        <xsl:template match="/"><xsl:apply-templates/></xsl:template> 
    
        <xsl:template match="root"><xsl:text>{Start:</xsl:text><xsl:text>&#xD;</xsl:text><xsl:value-of select="Child1"/><xsl:text xml:space="preserve">&#xA;</xsl:text><xsl:value-of select="Child2"/><xsl:text xml:space="preserve">&#xA;</xsl:text><xsl:text>End:}</xsl:text></xsl:template> 
    </xsl:stylesheet> 
    

    显然不足之处是每个模板的内容必须包含空格只有,你想让它出现在输出中。所以你不能使用空格来使XSL本身更具可读性。但至少你不必一遍又一遍地输入xml:space="preserve"。你选。 :)

    我想技术上这意味着这不是一个C#问题毕竟。可能应该从你的问题中删除该标签。 :)

  • +0

    对不起,我错误的XMLWriter不适用于我。但这样做仍然不缩进我的输出。还有其他建议吗? – user3313541 2015-03-19 15:50:33

    +0

    @ user3313541:我能够根据您提供的内容创建一个良好的工作代码示例。请参阅上面的编辑以获取对_XSL_问题的答案。 :) – 2015-03-19 17:03:48

    +0

    工作表示感谢,我很感激我不确定问题出在哪里,Happy可以在XSLT中修复它。 – user3313541 2015-03-19 17:16:30