Преобразование XSL и экранирование специальных объектов XML - PullRequest
3 голосов
/ 16 декабря 2009

У меня есть XML-файл, который преобразуется с помощью XSL. Некоторые элементы должны быть изменены, некоторые должны быть оставлены как есть - в частности, текст с сущностями ", & amp; , " * , & lt; , & gt; следует оставить как есть, а в моем случае " и " заменены на " и ' соответственно.

Тест XML:

<?xml version="1.0" encoding="UTF-8" ?>
<root>
    <element>
        &quot;
        &amp;
        &apos;
        &lt;
        &gt;
    </element>
</root>

файл преобразования:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="no" indent="no" />
    <xsl:template match="element">
        <xsl:copy>
            <xsl:value-of disable-output-escaping="no" select="." />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

результат:

<?xml version="1.0" encoding="UTF-8"?>
    <element>
        "
        &amp;
        '
        &lt;
        &gt;
    </element>

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

<?xml version="1.0" encoding="UTF-8"?>
    <element>
        &quot;
        &amp;
        &apos;
        &lt;
        &gt;
    </element>

У меня есть 2 вопроса:

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

Ответы [ 2 ]

3 голосов
/ 16 декабря 2009

Причина в том, что <, > и & всегда должны быть экранированы в XML. Они имеют особое значение в XML, поэтому к ним нужно обращаться особенно, если они являются частью данных (вместо разметки).

Два других, ' и ", могут быть экранированы, их имена сущностей известны XML (в основном, для обеспечения правильного функционирования значений атрибутов, например:

<xml ackbar="He said, &quot;It's a trap!&quot;" />
<xml ackbar='He said, "It&apos;s a trap!"' />

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

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

На самом деле все ваши данные могут находиться в экранированной форме (пронумерованные объекты, как в &#10;) без изменения фактического документа - отличается только сериализованное представление.

Пока вы работаете с инструментами, поддерживающими XML (например, анализаторы DOM), вы никогда не заметите разницы. Следствие: если вы не работаете с инструментами, поддерживающими XML (например, регулярное выражение или манипулирование строками), вам следует немедленно прекратить это. ; -)

0 голосов
/ 25 декабря 2009

Вы всегда можете избежать оригинального амперсанда, по сути это будет выглядеть примерно так:

&amp;quot;
...