XSLT-преобразование не имеет правильного отступа - PullRequest
5 голосов
/ 08 мая 2011

Вот 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>

Вот результат преобразования XSLT:

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

Вот как я делаю преобразование:

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

Почему формат не имеет отступ?Позже в выходных данных некоторые вещи имеют отступ.Не уверен почему.Я ищу решение, которое учитывает настройки формата, указанные в XSLT.Этот код используется для записи в любой формат (XML, HTML, текст и т. Д.), Поэтому я не хочу, чтобы конкретный код работал, например, только с XML.Но если мой XSLT имеет выход XML и установлен на отступ, то это следует учитывать.

Ответы [ 3 ]

4 голосов
/ 09 мая 2011

По умолчанию 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);
        }
    }
}
3 голосов
/ 03 августа 2017

Это довольно старый, но я столкнулся с ним, когда я испытывал то, что я считаю той же проблемой, и ни один из ответов не помог мне.В результате я получил правильный отступ в своем преобразованном xml после добавления тега ниже к своему xslt.

xsl:strip-space elements="*"

Я думаю, что некоторые пробелы отбрасывают вещи.Просто хотел поставить это здесь, на случай, если кто-то другой наткнется, как я.

0 голосов
/ 08 мая 2011

HTML не требует отступов, так зачем вам?

Если вам действительно нужен отступ, используйте классы XmlWriter и XmlWriterSettings для записи в объект FileStream.

...