2008-09-15 2 views
18

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

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

+0

Что такое четвёртое тег этого вопроса? Я просто думаю, что это должно быть обслужено ... – 2008-09-15 23:18:08

+0

Два пробела в конце, казалось, сделали второе пространство его тегом. – grapefrukt 2008-09-16 07:23:45

+0

@DimitreNovatchev Действительно, его исчерпывающий ответ и многое другое. Я попробую это на работе. – 2015-10-13 06:14:13

ответ

5

Использование disable-output-escaping="yes" в вашем value-of теге

-3

попробовать: < XSL: стоимость отборных = "& усилителя;" disable-output-escaping = "yes" />

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

0

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

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

4

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

10

Вы выражаете 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

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

<xsl:output method="text"/> 

на это будет препятствовать таблицам стилей от уходящих вещей и <xsl:value-of select="'&amp;'" /> должны производить &.

0

Следует отметить, что вы можете использовать отключаем-выход-ускользающей в пределах стоимости узла или строки/текста, как:

<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: значение-оф.

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

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

Поскольку мелким шрифтом является цитата:

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

акцент мой.

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

16

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

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

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

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

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

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

1

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

<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" ..

11

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

У меня возникли проблемы с получением символа & для отображения в 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 - как (часть) текстового узла в хорошо сформированном XML-документе или в дереве HTML.

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

Помните: Строка, которая представлена ​​как (часть) XML-текстового узла или внутри дерева 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, который выводится различными (или даже «поврежден»), чем один выход в первой трансформации?

Ответ:

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

Вопрос:

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

Ответ:

Нет, как показано в первой трансформации.

Вопрос:

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

Ответ:

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

Вопрос

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

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

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

Ответ

На самом деле, вы можете указать && булевой операции внутри выражения 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?'; 

} 

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

enter image description here

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

enter image description here

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

enter image description here

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

Например, если изменить <input> элемент к этому:

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

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

enter image description here

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

enter image description here

Второе предупреждение пропускается, поскольку первый операнд && операции был false и JavaScript является shortcutting в && где первый операнд является false.

Резюмируя:

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

1

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

<![CDATA[&]]> 

данные. EX: XML Data

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

XSLT тег:

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

Выход: Империя & Burlesque

Смежные вопросы