XSLT Compiled Transform を使用する場合、出力をフォーマットすることができません。常にすべてのスペースが取り除かれ、人間が判読できる形式ではありません。
ただし、Visual Studio XSLT Debugger を使用して同じ変換を実行すると、出力はきれいにインデントされます。私のコードは次のようになります。
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 Debugger は、出力の書式設定を保持するために何が異なるのでしょうか?
私はすでにこのリンクを見てきました: XSLT Transform not indenting correctly
テキストに出力するので、これは私には当てはまりません。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">
</xsl:text>
<xsl:value-of select="Child1"/>
<xsl:text disable-output-escaping="yes">
</xsl:text>
<xsl:value-of select="Child2"/>
<xsl:text disable-output-escaping="yes">
</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 Compiled 変換はすべてのスペースと改行を取り除きます。