XSLT Transform not indenting properly

2020-04-05 08:11发布

Here is an 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>

Here is the output of the XSLT Transformation:

<div class="Field"><span class="Label">Name:</span><span class="Input"></span></div>

Here is how I'm doing the transformation:

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);
        }
    }
}

Why is the format not indented? Later on in the output, some things are indented. Not sure why. I'm looking for a solution that will honor the format settings as specified in the XSLT. This code is used to write to any format (XML, HTML, text, etc.) so I don't want specific code that will only work with XML, for example. But if my XSLT has an output of XML and is set to indent, then that should be honored.

3条回答
家丑人穷心不美
2楼-- · 2020-04-05 08:44

HTML does not require indentation, so why do you?

If you really need indentation, use the XmlWriter and XmlWriterSettings classes to write to the FileStream object.

查看更多
该账号已被封号
3楼-- · 2020-04-05 08:51

This is pretty old, but I ran across it when I was experiencing what i believe to be the same issue and none of the answers helped me. I ended up getting the correct indentation on my transformed xml after adding the tag below to my xslt.

xsl:strip-space elements="*"

I guess there was some white space throwing things off. Just wanted to put it here in case someone else stumbles upon like I did.

查看更多
神经病院院长
4楼-- · 2020-04-05 09:01

By default XmlWriter (which here is being used implicitly by XslCompiledTransform) does not indent your xml, and won't automatically use the settings speicifed in your xslt.

You can either explicitly supply settings to an XmlWriter that specify that the output can be indented, or the better approach is to have XmlWriter use the settings supplied by the 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);
        }
    }
}
查看更多
登录 后发表回答