XSL короткий `value-of` с` disable-output-escaping`? - PullRequest
0 голосов
/ 13 декабря 2010

Я обрабатываю следующий (пример) XML:

<?xml version="1.0"?>
<root>&amp; &amp; &amp;</root>

через следующий (пример) XSL:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0">
  <xsl:output
    method="html"
    version="4.0"
    encoding="UTF-8"
    omit-xml-declaration="yes"
    />
  <xsl:template match="/">
    <input value="{/root}" />
  </xsl:template>
</xsl:stylesheet>

с использованием Python и lxml (libxslt-1.1.17), и я получаю следующий вывод:

<input value="&amp;amp; &amp;amp; &amp;amp;" />

Я понимаю, что могу обойти это с помощью следующего шаблона:

  <xsl:template match="/">
    <input>
      <xsl:attribute name="value">
        <xsl:value-of 
          select="/root" 
          disable-output-escaping="yes" 
          />
      </xsl:attribute>
    </input>
  </xsl:template>

, но это лот набора текста.Работая с XSL в PHP, я не помню, чтобы когда-либо использовался этот обходной путь для удаления кавычек сущностей XML с помощью краткой формы value-of.Есть ли короткое исправление для этого, поэтому нам не нужно вводить все вышеперечисленное?

1 Ответ

1 голос
/ 13 декабря 2010

DOE фактически предназначен для таких случаев. Извините, если вы это знаете, просто чтобы быть последовательным.

http://www.w3.org/TR/xslt#disable-output-escaping

Обычно метод вывода xml экранирует & и <(и, возможно, другие символы) при выводе текстовых узлов. Это гарантирует, что на выходе будет правильно сформированный XML. Тем не менее, иногда удобно иметь возможность выводить почти что, но не совсем правильно сформированный XML; например, выходные данные могут включать в себя плохо сформированные разделы, которые предназначены для преобразования в правильно сформированный XML с помощью последующего процесса, не поддерживающего XML. По этой причине XSLT предоставляет механизм отключения экранирования выходных данных. Элемент xsl: value-of или xsl: text может иметь атрибут disable-output-escaping ... </p>

Полагаю, реальная боль в том, что вы не можете использовать DOE в выражении значения атрибута, например {disable-output-escaping(root)}.

Итак, я не могу придумать способ сократить это.

...