Как сохранить пробелы элемента xml в XSLT - PullRequest
0 голосов
/ 09 октября 2018

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

входной XML:

<Item>
    <type>4</typr>
    <name>         test      </name>
</Item>

XSLT:

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:preserve-space elements="name"/>

    <xsl:template match="Item">
       <xsl:element name="Itemtransformed">
           <xsl:element name="itemname"><xsl:value-of select="//name></xsl:element>
       </xsl:element>
    </xsl:template>
</xsl:stylesheet>

Ожидаемый результат:

<Itemtransformed>
    <itemname>         test      </itemname>
</Itemtransformed>

Когда я попытался преобразовать это в .Net с помощью System.Xml.Xsl.XslCompiledTransform.Transform (вход IXPathNavigable, аргументы XsltArgumentList, результаты XmlWriter), я получаю ошибку ниже

"Пробел не может быть удален из уже загруженных входных документов. Вместо этого предоставьте входной документ как XmlReader."

Любая идея, как исправить это или любой другой возможный способ сохранить пробел.

Спасибо за ваше драгоценное время

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Проблема не имеет ничего общего с начальным и конечным пробелом вокруг «теста», который XSLT автоматически сохранит, что бы вы ни говорили в xsl:strip-space и xsl:preserve-space.Скорее проблема заключается в ограничении в реализации Microsoft System.Xml.Xsl xsl:strip-space - ограничении, которое объясняется (не особенно хорошо) в вопросе, цитируемом @ RomanSS.

В основном, если вы предоставляете-встроенное дерево DOM в качестве входных данных для процессора XSLT, тогда требование в спецификации XSLT обрезать пробельные текстовые узлы довольно сложно, и похоже, что Microsoft ответила на вызов, введя ограничение.Другие способы удовлетворить это требование включают в себя:

(a) Изменить поставляемое дерево DOM на месте, чтобы удалить пробельные текстовые узлы

(b) Обернуть предоставленное дерево DOM в оболочку, которая делаеттекстовые узлы пропусков, невидимые при навигации по дереву

(c) Массовое копирование поставляемого дерева DOM в новое дерево, в котором пропущены текстовые узлы пропусков.

Саксонский использует все три стратегии при разницеобстоятельства;все они дорогие.Гораздо эффективнее выполнять удаление пустых пространств при разборе документа и построении дерева, что Microsoft заставляет вас делать, устанавливая ограничение.

Но ни одно из этого не имеет ничего общего с вашей проблемой.Если вы избавитесь от объявлений xsl:strip-space и xsl:preserve-space, пробел вокруг «test» будет сохранен так, как вы этого хотите.Объявления xsl:strip-space и xsl:preserve-space затрагивают только те текстовые узлы, которые полностью состоят из пробелов.

0 голосов
/ 09 октября 2018

Может быть, это то, что вы ищете.Кажется, в показанном коде проблемы не существует. Пробелы нельзя удалить из уже загруженных входных документов.Вместо этого укажите входной документ как XmlReader

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