Преобразование xslt с escape-объектом

У меня есть XML, и я хотел бы изменить значение атрибута (name="name") на другое (name="value") со следующим xslt:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<!--xsl:template match="text()"-->
<!--xsl:text select="." disable-output-escaping="yes" /-->
<!--xsl:value-of select="." disable-output-escaping="yes" />
   <xsl:copy-of select="child::*"/> 
  </xsl:template-->

<xsl:template match="@*|node()" mode="s">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" mode="s"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="@*|node()" mode="se">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" mode="se"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="@name" mode="se">
    <xsl:attribute name="name">value</xsl:attribute>
</xsl:template>
<xsl:template match="tag5[@type='testtype']">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" mode="s"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="tag6[@name='name']" mode="s">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" mode="se"/>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

Фрагмент ввода XML:

<?xml version="1.0" encoding="UTF-8"?>
<dataroot version="2.0">
<Model id="111" name="test">
    <tag1 id="222" type="VERSION">
        <tag2 id="333" name="Version" value="2"/>
    </tag1>
    <tag3 id="444">
        <tag4 id="555" versionID="test/00001" name="name" definition="through test. &#xD;&#xA;" attrs="12 23"/>
        <tag4 id="666" versionID="test/00001" name="name" definition="through test 2. &#xD;&#xA;" messages="34 45"/>
    </tag3>
    <tag5 id="777" type="testtype">
        <tag6 id="888" name="name" value="667"/>
        <tag6 id="999" name="context" value="FIX 5.0"/>
    </tag5>
</Model>
</dataroot>

ВЫВОД XML после применения xslt:

<?xml version="1.0" encoding="UTF-8"?>
<dataroot version="2.0">
<Model id="111" name="test">
    <tag1 id="222" type="VERSION">
        <tag2 id="333" name="Version" value="2"/>
    </tag1>
    <tag3 id="444">
        <tag4 id="555" versionID="test/00001" name="name" definition="through test. &#13;&#10;" attrs="12 23"/>
        <tag4 id="666" versionID="test/00001" name="name" definition="through test 2. &#13;&#10;" messages="34 45"/>
    </tag3>
    <tag5 id="777" type="testtype">
        <tag6 id="888" name="value" value="667"/>
        <tag6 id="999" name="context" value="FIX 5.0"/>
    </tag5>
</Model>
</dataroot>

Xslt в основном делает то, что от него ожидают. Однако с неожиданным преобразованием:

&#xD;&#xA;   ->   &#13;&#10;   (unexpected transform)

Я хочу сохранить исходные сущности. Я пробовал отключить вывод-escape (см. раздел комментариев в xslt с заменой текста на @definition), не работает. Какие-либо предложения?

Я использую xsltproc кстати.

Заранее спасибо!


person dellair    schedule 25.03.2016    source источник
comment
Вы не можете сохранить ссылки на символы с помощью XSLT, процессор XSLT использует синтаксический анализатор XML для анализа входных данных в дереве узлов со значениями символов Unicode, а затем работает с символами Unicode. Затем результат преобразования сериализуется, где выполняется любое необходимое экранирование. Таким образом, вы не можете решить эту проблему с помощью чистого XSLT, вам нужно будет посмотреть на свой конкретный процессор XSLT и его функции сериализации, можете ли вы принудительно использовать ссылки на шестнадцатеричные символы.   -  person Martin Honnen    schedule 25.03.2016
comment
@MartinHonnen, я использую xsltproc, какие-нибудь советы?   -  person dellair    schedule 25.03.2016
comment
@delair Какая разница? И &#xA;, и &#10; являются одинаково допустимыми представлениями одного и того же символа. Зачем тебе это?   -  person michael.hor257k    schedule 25.03.2016
comment
@ michael.hor257k, XML-файл — это модель, которая является источником многих других инструментов. Следовательно, каждый атрибут обрабатывается разными и несколькими инструментами. Я хочу минимизировать изменения, чтобы избежать неожиданностей.   -  person dellair    schedule 25.03.2016
comment
Любой инструмент, соответствующий стандарту XML, должен иметь возможность одинаково обрабатывать оба представления. В любом случае, вы не можете сохранить исходное представление (как уже объяснял Мартин Хоннен), вы можете только форсировать тот или иной тип представления. Это можно сделать в XSLT 1.0 самостоятельно, заменив символы экранированными строками (например, &amp;#xA;) и выведя их с помощью DOE, но это большая работа.   -  person michael.hor257k    schedule 25.03.2016
comment
@ michael.hor257k, спасибо, я буду использовать Perl для его обработки.   -  person dellair    schedule 25.03.2016


Ответы (1)


Кажется, что xslt не может справиться с этим требованием, поэтому я сделал это на perl. Спасибо всем!

person dellair    schedule 25.03.2016
comment
xslt не может справиться с этим требованием Это не то, что я сказал. - person michael.hor257k; 25.03.2016
comment
Ваша программа Perl почти наверняка вводит зависимость от точного способа представления входного документа. Именно потому, что люди настаивают на написании таких программ, а не на использовании настоящего синтаксического анализатора XML, вы в конечном итоге столкнетесь с трудностью, с которой начали: вы не можете сгенерировать произвольный XML, вы должны сгенерировать некоторое подмножество/диалект XML, потому что кто-то написал приложение на принимающей стороне, которое неправильно анализирует XML. Таким образом, вы попадаете в порочный круг, в котором вы обмениваетесь данными с использованием проприетарного синтаксиса и теряете все преимущества стандартного XML. - person Michael Kay; 25.03.2016
comment
@ michael.hor257k, извините, я мог неправильно понять. Но я не мог легко найти решение для этого требования. - person dellair; 26.03.2016
comment
@MichaelKay, ваш комментарий верен, но иногда мы хотим быть гибкими в использовании технологий для разных целей. В этом случае я использую альтернативу для удовлетворения потребностей просто потому, что я не смог сделать это через xslt. Пожалуйста, не стесняйтесь опубликовать свой ответ, и я с радостью приму его. - person dellair; 26.03.2016
comment
Вы не можете делать с XSLT то, что хотите, потому что это плохая практика. - person Michael Kay; 26.03.2016
comment
@dellair Я изложил возможное решение в своем комментарии выше. Я не буду вдаваться в подробности, потому что (1) как я уже сказал, это много работы и (2) я не думаю, что это необходимо. -- П.С. Не могли бы вы протестировать целевые приложения с новым форматом? Возможно, вы пытаетесь решить проблему, которой не существует (и уж точно не должно существовать). - person michael.hor257k; 26.03.2016
comment
Кей, вы должны понимать, что есть отрасли, использующие комбинацию xml и других инструментов. В идеальном мире это одна технология, решающая все вопросы. Но это не так. А миграция — это не тривиальное и не простое слово. Я понимаю, что люди видят вещи с разных точек зрения. Закроем беседу пока. Спасибо за проявленный интерес. - person dellair; 27.03.2016