xslt, javascript и неэкранированные html-объекты - PullRequest
1 голос
/ 12 января 2009

У меня есть небольшая проблема с сущностями xslt, js и html, например. в шаблоне:

<script type="text/javascript">
    <xsl:value-of select="/some/node"/>
    for (var i = 0; i &lt; 5; i++) {
        //            ^^^ js error
    }
</script>

<script type="text/javascript">
    <xsl:value-of select="/some/node"/>
    for (var i = 0; i < 5; i++) {
        //            ^ xslt error
    }
</script>

<script type="text/javascript">
    <xsl:value-of select="/some/node"/>
    // <![CDATA[
    for (var i = 0; i < 5; i++) {
        //            ^ becomes &lt;
    }
    // ]]>
</script>


<script type="text/javascript">
    <xsl:value-of select="/some/node"/>
    for (var i = 0; i <xsl:value-of disable-output-escaping="yes" select="string('&lt;')"/> 5; i++) {
        // works of course
    }
</script>

У кого-нибудь есть идея, откуда может возникнуть моя проблема? я всегда думал, что процессор xslt оставит содержимое элемента без экранирования при использовании метода вывода html ...

Я запускаю libxslt2 версии 1.1.24 на OSX, который был установлен с использованием macportsports ...

Ответы [ 5 ]

11 голосов
/ 12 января 2009

ки. Длинная история, короткий ответ:

кажется, что при некоторых версиях libxslt процессор xslt оставляет содержимое элемента без экранирования при использовании метода вывода html, с другими не ... поэтому рекомендуется следующее:

<script type="text/javascript">
    <xsl:value-of select="/some/node"/>
    <xsl:text disable-output-escaping="yes">
        // ^ does the trick ...
        for (var i = 0; i < 5; i++) {
            //            ^ works
        }
    </xsl:text>
</script>
4 голосов
/ 12 января 2009

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

Вы правы: http://www.w3.org/TR/xslt#section-HTML-Output-Method

The html output method should not perform escaping for the content of the script and style elements.
For example, a literal result element written in the stylesheet as
    <script>if (a &lt; b) foo()</script>
or
    <script><![CDATA[if (a < b) foo()]]></script>
should be output as
    <script>if (a < b) foo()</script>

Если ваш XSLT-процессор работает иначе, это ошибка.

Однако в любом случае рекомендуется избегать использования «<» и «&» во встроенных сценариях, а еще лучше - выбросить весь код в связанный файл .js. </p>

1 голос
/ 12 января 2009

Попробуйте удалить двойную косую черту перед CDATA вашего третьего решения

1 голос
/ 12 января 2009

Блоки CDATA должны были сработать; они всегда есть для меня. Какое ваше disable-output-escaping значение?

UPDATE: Используя Xalan, с disable-output-escaping по умолчанию, который, я уверен, no, у меня есть следующие в моих рабочих файлах XSL:

  • Нет CDATA блок:

    for (var i = 0; i `&lt;` foo.length; i++) {
    …
    }
    
  • CDATA блок:

    <![CDATA[
    
    for (var i = 0; i < foo.length; i++) { … }
    
    ]]>
    
0 голосов
/ 18 марта 2010

Если метод xsl:output html, секция CDATA будет работать. Если метод xsl:output является xml, знаки <и> все равно будут преобразованы.

Чтобы обойти эту проблему, вы можете определить элемент script, чтобы он так себя не вел, используя элемент xsl: output. Вы также можете форсировать метод вывода, используя xml или html

<xsl:output method="xml" cdata-section-elements="script" />
...
<script type="text/javascript" language="javascript">
<![CDATA[
  for (var i = 0; i &lt; foo.length; i++) { … }
]]>
</script>
...