2009-12-16 5 views
3

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

Тест 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 вопроса:

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

ответ

3

Причина заключается в том, что <, > и & всегда должны быть экранированы в 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

Пожалуйста, ознакомьтесь с «желаемый результат:» часть моего вопроса - не было вынесено правильно, поэтому я отредактировал его. – NSPKUWCExi2pr8wVoGNk

+0

Это не влияет на мой ответ. ;-) Я могу быть более явным: вы, вероятно, не можете получить желаемый результат, и в любом случае - вы не должны заботиться о том, как одиночные или двойные кавычки отображаются в файле XML. – Tomalak

+0

Кажется, нет других мнений, и этот ответ довольно информативен, поэтому я согласен с этим. Спасибо. – NSPKUWCExi2pr8wVoGNk

0

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

&amp;quot;