Xsl преобразование сокращает пространство между двумя - PullRequest
2 голосов
/ 05 июля 2011

В моем файле xsl есть следующая строка:

   network <xsl:value-of select="/config/areas/inside/network"/>&#32;<xsl:value-of select="/config/areas/inside/subnetmask"/>

Мой код преобразования в C #:

        XPathDocument xPathDoc = new XPathDocument(xmlPath);
        //XslTransform xslTrans = new XslTransform(); -> Deprecated!
        XslCompiledTransform xslTrans = new XslCompiledTransform();

        XmlTextWriter writer = new XmlTextWriter("config.cfg", Encoding.UTF8);

        xslTrans.Load(xslPath);

        xslTrans.Transform(xPathDoc, null, writer);

        writer.Close();

С устаревшей версией все работает нормально (после того, как я поместил код ASCII для пробела между двумя элементами), но класс XslCompiledTransform содержит некоторые другие алгоритмы нормализации, и я не знаю, как избежать этого поведения.

Есть предложения?

1 Ответ

4 голосов
/ 05 июля 2011

Хорошо, ваша проблема здесь в том, что когда вы помещаете &#32; в документ XML, это технически ничем не отличается от ввода обычного пространства, и, следовательно, анализатор XML обрабатывает его как пробел.

Я бы предложил изменить эту строку на

<xsl:value-of select="concat('network ',/config/areas/inside/network,' ',/config/areas/inside/subnetmask)" />

Заключив пространство в функцию concat следующим образом, он не будет размещаться в документе XML как отдельный узел и не будет ошибочно принят за нерелевантные пробелы.

Не относится к вашей проблеме, но я бы также рекомендовал обернуть XmlTextWriter в блок использования:

using (XmlTextWriter writer = new XmlTextWriter("config.cfg", Encoding.UTF8))
{
    xslTrans.Load(xslPath);
    xslTrans.Transform(xPathDoc, null, writer);
}

Он автоматически корректно утилизирует писателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...