XSLT转换没有正确缩进

Jos*_* M. 6 .net c# xml xslt transform

这是一个XSLT:

<xsl:stylesheet version="1.0" xmlns:P="http://abc.com/Xyz.xsd" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
    <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="Thing">
        <xsl:element name="div">
            <xsl:attribute name="class">
                <xsl:text>Field</xsl:text>
            </xsl:attribute>

            <xsl:element name="span">
                <xsl:attribute name="class">
                    <xsl:text>Label</xsl:text>
                </xsl:attribute>

                <xsl:value-of select="$displayName"/>
                <xsl:text>:</xsl:text>
            </xsl:element>
            <xsl:element name="span">
                <xsl:attribute name="class">
                    <xsl:text>Input</xsl:text>
                </xsl:attribute>
            </xsl:element>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

这是XSLT转换的输出:

<div class="Field"><span class="Label">Name:</span><span class="Input"></span></div>
Run Code Online (Sandbox Code Playgroud)

以下是我正在进行的转型:

XslCompiledTransform xslTransform = new XslCompiledTransform();

xslTransform.Load(xsltPath, new XsltSettings(true, true), new XmlUrlResolver());

using (FileStream outputStream = File.Create(outputPath))
{
    using (StringReader stringReader = new StringReader(xml))
    {
        using (XmlReader xmlReader = XmlReader.Create(stringReader))
        {
            xslTransform.Transform(xmlReader, outputStream);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么格式没有缩进?稍后在输出中,有些东西缩进了.不知道为什么.我正在寻找一种能够遵循XSLT中指定的格式设置的解决方案.此代码用于写入任何格式(XML,HTML,文本等),因此我不希望具有仅适用于XML的特定代码.但是,如果我的XSLT具有XML输出并且设置为缩进,那么这应该得到尊重.

Jus*_*tin 5

默认情况下XmlWriter(此处由隐式使用XslCompiledTransform)不会缩进xml,也不会自动使用xslt中指定的设置。

您可以为明确提供设置以XmlWriter指定可以缩进输出,或者更好的方法是XmlWriter使用xslt提供的设置:

XslCompiledTransform xslTransform = new XslCompiledTransform();
xslTransform.Load(xsltPath, new XsltSettings(true, true), new XmlUrlResolver());

using (XmlWriter writer = XmlWriter.Create(outputPath, xslTransform.OutputSettings))
{
    using (StringReader stringReader = new StringReader(xml))
    {
        using (XmlReader xmlReader = XmlReader.Create(stringReader))
        {
            xslTransform.Transform(xmlReader, writer);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

这已经很老了,但是当我遇到我认为是同一问题时遇到了它,并且没有一个答案对我有帮助。将下面的标签添加到我的 xslt 后,我​​最终在转换后的 xml 上获得了正确的缩进。

<xsl:strip-space elements="*" />
Run Code Online (Sandbox Code Playgroud)

我猜想有一些空白会导致事情发生。只是想把它放在这里,以防其他人像我一样偶然发现。


dev*_*vio -3

HTML 不需要缩进,那为什么要缩进呢?

如果确实需要缩进,请使用XmlWriterXmlWriterSettings类写入 FileStream 对象。