Подтвердить что ты не робот

Не удается получить xslt для вывода (&) даже после экранирования символа

Я пытаюсь создать строку запроса назначений переменных, разделенных символом & (ex: "var1=x&var2=y&..."). Я планирую передать эту строку во встроенный флеш файл.

У меня возникли проблемы с получением символа & для отображения в XSLT. Если я просто набираю & без тегов вокруг него, возникает проблема с визуализацией XSLT-документа. Если я набираю &amp; без тегов вокруг него, то вывод документа &amp; без изменений. Если я набираю <xsl:value-of select="&" /> или <xsl:value-of select="&amp;" />, я также получаю сообщение об ошибке. Это возможно? Примечание. Я также пробовал &amp;amp; без успеха.

4b9b3361

Ответ 1

Вы можете объединить disable-output-escaping с разделом CDATA. Попробуйте следующее:

<xsl:text disable-output-escaping="yes"><![CDATA[&]]></xsl:text>

Ответ 2

Я пытаюсь создать строку запроса разделов переменных, разделенных символом & (ex: "var1=x&var2=y&..."). Я планирую передать это string во встроенный флеш файл.

Мне не удается получить символ & для отображения в XSLT.

Вот пропустимая, короткая и полная демонстрация того, как создать такой URL:

<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:variable name="vX" select="'x'"/>
 <xsl:variable name="vY" select="'y'"/>
 <xsl:variable name="vZ" select="'z'"/>

  <xsl:template match="/">
    <xsl:value-of select=
"concat('http://www.myUrl.com/?vA=a&amp;vX=', $vX, '&amp;vY=', $vY, '&amp;vZ=', $vZ)"/>
  </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к любому исходному XML-документу (игнорируется):

<t/>

выдается желаемый, правильный результат:

http://www.myUrl.com/?vA=a&vX=x&vY=y&vZ=z

Что касается других вопросов, поднятых в вопросе:

Если я набираю &amp; без тегов вокруг него, то вывод документ &amp; без изменений.

Вышеприведенное утверждение просто неверно... Просто запустите преобразование выше и посмотрите на результат.

Что действительно происходит:

Результат, который вы видите, абсолютно правильный, однако ваш метод вывода html или xml (значение по умолчанию для method=), поэтому сериализатор XSLT-процессора должен представлять правильный результат - строку http://www.myUrl.com/?vA=a&vX=x&vY=y&vZ=z - как (часть) текста node в хорошо сформированном документе XML или в дереве HTML.

По определению в хорошо сформированном XML-документе буквальный амперсанд должен быть экранирован символьной ссылкой, такой как встроенный &amp; или &#38;, или &#x26;

Помните. Строка, которая представлена ​​как (часть) XML-текста node, или внутри дерева HTML, может не похожа на ту же строку, если представлена ​​в виде текста. Тем не менее, это два разных представления одной и той же строки.

Чтобы лучше понять этот простой факт, сделайте следующее:

Возьмите вышеуказанное преобразование и замените объявление xsl:output:

 <xsl:output method="text"/>

с этим:

 <xsl:output method="xml"/>

Кроме того, объедините вывод в одном XML-элементе. Вы также можете попробовать использовать различные экраны для амперсанда. Теперь преобразование может выглядеть следующим образом:

<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" method="xml"/>

 <xsl:variable name="vX" select="'x'"/>
 <xsl:variable name="vY" select="'y'"/>
 <xsl:variable name="vZ" select="'z'"/>

  <xsl:template match="/">
        <t>
            <xsl:value-of select=
 "concat('http://www.myUrl.com/?vA=a&amp;vX=', $vX, '&#38;vY=', $vY, '&#x26;vZ=', $vZ)"/>
        </t>
  </xsl:template>
</xsl:stylesheet>

И результат:

<t>http://www.myUrl.com/?vA=a&amp;vX=x&amp;vY=y&amp;vZ=z</t>

Вы получите тот же результат с методом вывода html.

Вопрос

Является ли URL, который выводится другим (или даже "поврежденным" ), чем один вывод в первом преобразовании?

Ответ

Нет, в обоих случаях выводилась одна и та же строка - однако в каждом случае использовалось другое представление строки.

Вопрос

Должен ли я использовать атрибут DOE (disable-output-escaping="yes") для вывода желаемого URL-адреса?

Ответ

Нет, как показано в первом преобразовании.

Вопрос

Рекомендуется ли использовать атрибут DOE (disable-output-escaping="yes") для вывода желаемого URL-адреса?

Ответ

Нет, использование DOE является плохой практикой в ​​XSLT и обычно является сигналом о том, что у программиста нет хорошего понимания модели обработки XSLT. Кроме того, DOE является лишь дополнительной функцией XSLT 1.0, и возможно, что ваш XSLT-процессор не реализует DOE, или даже если это произойдет, у вас могут возникнуть проблемы с тем же преобразованием с другим XSLT-процессором.

Вопрос

Я пришел из другой проблемы к вопросу, за который я получил щедрость. Моя проблема: я пытаюсь создать этот метод onclick:

    <input type="submit" 
onClick="return confirm('are you sure?') && confirm('seriously?');" />

что я могу сделать: я могу поместить подтверждения в функцию... но ее buggin me, что я не могу сделать и внутри атрибута! Решение этот вопрос является решением моей проблемы, я думаю.

Ответ

Собственно, вы можете указать логическую операцию && в выражении JavaScript внутри атрибута, представляя ее как &amp;&amp;

Вот полный пример, который каждый может запускать, как и в трех браузерах: Chrome, Firefox 41.1.01 и IE11:

HTML

<!DOCTYPE html> 

    <html> 
      <head> 
        <link rel="stylesheet" href="style.css"> 
        <script src="script.js"></script> 
      </head> 
      <body> 
        <h1>Hello Plunker!</h1> 
        <input type="submit" 
onClick="alert(confirm('are you sure?') &amp;&amp; confirm('seriously?'));" /> 
      </body> 
    </html>

JavaScript (script.js):

function confirm(message) { 
  alert(message); 
  return message === 'are you sure?'; 

}

Когда вы запустите это, вы сначала получите это предупреждение:

введите описание изображения здесь

Затем, после нажатия кнопки OK, вы получите второе предупреждение:

введите описание изображения здесь

И после нажатия OK вы, наконец, получите предупреждение, которое приведет к результату операции &&:

введите описание изображения здесь

Вы можете играть с этим кодом, изменяя значения аргументов, переданных функции confirm(), и вы убедитесь, что полученные результаты являются результатом использования оператора &&.

Например, если вы измените элемент <input> на это:

<input type="submit" 
onClick="alert(confirm('really sure?') &amp;&amp; confirm('seriously?'));" /> 

Вы получите первое предупреждение:

введите описание изображения здесь

И когда вы нажмете OK, вы сразу получите окончательный результат операции &&:

введите описание изображения здесь

Второе предупреждение пропущено, потому что 1-й операнд операции && был false, а JavaScript сокращает &&, где 1-й операнд false.

Подводя итоги:

Легко использовать оператор && внутри атрибута в HTML-документе, сгенерированном XSLT, указав операнд && как &amp;&amp;

Ответ 3

Вы выражаете URI в HTML или XHTML? например <tag attr="http://foo.bar/?key=value&amp;key2=value2&amp;..."/> Если это так, "&amp;" - это правильный способ выражения амперсанда в значении атрибута, даже если он отличается от обычного URI, который вы хотите. Браузеры будут декодировать "&amp;" и любую другую ссылку на символ, прежде чем загружать их или передавать их во Flash. Чтобы вставить литеральный текст, одиночный "&" непосредственно в HTML или XHTML неверен.

Я также лично рекомендую узнать больше об XML, чтобы более четко продумать эти вещи. Например, попробуйте использовать W3C DOM больше (для более чем простого тривиального Javascript); даже если вы не используете его изо дня в день, изучение DOM помогло мне правильно подумать о древовидной структуре XML и о том, как правильно правильно кодировать атрибуты и элементы.

Ответ 4

Используйте disable-output-escaping="yes" в теге value-of

Ответ 5

Если вы создаете строку запроса как часть более крупного URL-адреса в атрибуте какого-либо другого тега (например, "embed" ), тогда вы действительно хотите, чтобы и было экранировано как & amp;. Хотя все браузеры выяснят, что вы имеете в виду, и "Делайте правильную вещь", если вы должны передать ваш сгенерированный документ на валидатор, он будет отмечать неэкранированное и значение атрибута.

Ответ 6

Если вы пытаетесь создать XML файл в качестве вывода, вы захотите создать &amp; (поскольку & на нем собственный недопустимый XML). Если вы просто создаете строку, вы должны установить режим вывода таблицы стилей на text, включив в качестве дочернего элемента xsl:stylesheet

следующее следующее:
<xsl:output method="text"/>

Это предотвратит экранирование стилей и <xsl:value-of select="'&amp;'" /> должно произвести &.

Ответ 7

Если ваше преобразование испускает XML-документ, вы не должны отключать выходное экранирование. Вы хотите, чтобы символы разметки были экранированы в выходном файле, чтобы вы не генерировали искаженный XML. Объект XML, обрабатывающий вывод с помощью (например, DOM), будет отменять текст для вас.

Если вы используете строковое манипулирование вместо объекта XML для обработки вывода, у вас есть проблема. Но проблема не в вашем XSLT, а в решении использовать манипуляции с строкой для обработки XML, что почти всегда плохое.

Если ваше преобразование испускает HTML или текст (и вы задали тип вывода в элементе <xsl:output>, верно?), это другая история. Затем вам нужно использовать disable-output-escaping='yes' для вашего элемента <xsl:value-of>.

Но в любом случае вам нужно будет избежать символов разметки в ваших текстовых узлах XSLT, если только вы не обернули текст в разделе CDATA.

Ответ 8

Отключить выходное экранирование выполнит задание...... поскольку этот атрибут поддерживается только для текста, вы можете манипулировать шаблоном, например:

 <xsl:variable name="replaced">

    <xsl:call-template name='app'>
      <xsl:with-param name='name'/>       
    </xsl:call-template>
  </xsl:variable>


<xsl:value-of select="$replaced" disable-output-escaping="yes"/>

--- > Обернул вызов шаблона в переменной и использовал disable-output-escaping = "yes"..

Ответ 9

Просто замените и

<![CDATA[&]]>

в данных. EX: XML данных

<title>Empire <![CDATA[&]]> Burlesque</title>

Тег XSLT:

<xsl:value-of select="title" />

Вывод: Империя и Бурлеск

Ответ 10

Использование атрибута disable-output-escaping (логическое), вероятно, является самым простым способом выполнения этого. Обратите внимание, что вы можете использовать это не только на <xsl:value-of/>, но также и с <xsl:text>, который может быть более чистым, в зависимости от вашего конкретного случая.

Здесь соответствующая часть спецификации: http://www.w3.org/TR/xslt#disable-output-escaping

Ответ 11

Следует отметить, что вы можете использовать disable-output-escaping в пределах значения node или строки/текста, например:

<xsl:value-of select="/node/here" disable-output-escaping="yes" />

или

<xsl:value-of select="'&amp;'" disable-output-escaping="yes" />
<xsl:text disable-output-escaping="yes">Texas A&amp;M</xsl:text>

Обратите внимание на одинарные кавычки в xsl: value-of.

Однако вы не можете использовать disable-output-escaping для атрибутов. Я знаю, что это полностью испортилось, но, как в XSLT 1.0. Таким образом, будет работать НЕ:

<xsl:value-of select="/node/here/@ttribute" disable-output-escaping="yes" />

Потому что в мелкой печати есть цитата:

Таким образом, это ошибка, чтобы отключить вывод экранирование для <xsl:value-of /> или <xsl:text />, который используется для генерировать строковое значение комментарий, инструкция по обработке или атрибут node;

внимание мое.

Взято из: http://www.w3.org/TR/xslt#disable-output-escaping

Ответ 12

org.apache.xalan.xslt.Process, версия 2.7.2, выводит приведенную выше фразу "Вот беглая, короткая и полная демонстрация того, как создать такой URL":

<?xml version="1.0" encoding="UTF-8"?>http://www.myUrl.com/?vA=a&amp;vX=x&amp;vY=y&amp;vZ=z11522

Декларация XML подавляется дополнительным omit-xml-declaration="yes", но, однако, с помощью method="text" вывода method="text" экранирование от амперсандов не оправдано.

Ответ 13

попробовать:   < xsl: значение-select = "& amp;" отключение-выход-маскирование = "да" /" >

Извините, если форматирование перепутано.