Ответ 1
Вы можете объединить disable-output-escaping
с разделом CDATA
. Попробуйте следующее:
<xsl:text disable-output-escaping="yes"><![CDATA[&]]></xsl:text>
Я пытаюсь создать строку запроса назначений переменных, разделенных символом &
(ex: "var1=x&var2=y&..."
). Я планирую передать эту строку во встроенный флеш файл.
У меня возникли проблемы с получением символа &
для отображения в XSLT. Если я просто набираю &
без тегов вокруг него, возникает проблема с визуализацией XSLT-документа. Если я набираю &
без тегов вокруг него, то вывод документа &
без изменений. Если я набираю <xsl:value-of select="&" />
или <xsl:value-of select="&" />
, я также получаю сообщение об ошибке. Это возможно? Примечание. Я также пробовал &amp;
без успеха.
Вы можете объединить disable-output-escaping
с разделом CDATA
. Попробуйте следующее:
<xsl:text disable-output-escaping="yes"><![CDATA[&]]></xsl:text>
Я пытаюсь создать строку запроса разделов переменных, разделенных символом
&
(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&vX=', $vX, '&vY=', $vY, '&vZ=', $vZ)"/>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к любому исходному XML-документу (игнорируется):
<t/>
выдается желаемый, правильный результат:
http://www.myUrl.com/?vA=a&vX=x&vY=y&vZ=z
Что касается других вопросов, поднятых в вопросе:
Если я набираю
&
без тегов вокруг него, то вывод документ&
без изменений.
Вышеприведенное утверждение просто неверно... Просто запустите преобразование выше и посмотрите на результат.
Что действительно происходит:
Результат, который вы видите, абсолютно правильный, однако ваш метод вывода html
или xml
(значение по умолчанию для method=
), поэтому сериализатор XSLT-процессора должен представлять правильный результат - строку http://www.myUrl.com/?vA=a&vX=x&vY=y&vZ=z
- как (часть) текста node в хорошо сформированном документе XML или в дереве HTML.
По определению в хорошо сформированном XML-документе буквальный амперсанд должен быть экранирован символьной ссылкой, такой как встроенный &
или &
, или &
Помните. Строка, которая представлена как (часть) 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&vX=', $vX, '&vY=', $vY, '&vZ=', $vZ)"/>
</t>
</xsl:template>
</xsl:stylesheet>
И результат:
<t>http://www.myUrl.com/?vA=a&vX=x&vY=y&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 внутри атрибута, представляя ее как &&
Вот полный пример, который каждый может запускать, как и в трех браузерах: 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?') && 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?') && confirm('seriously?'));" />
Вы получите первое предупреждение:
И когда вы нажмете OK
, вы сразу получите окончательный результат операции &&
:
Второе предупреждение пропущено, потому что 1-й операнд операции &&
был false
, а JavaScript сокращает &&
, где 1-й операнд false
.
Подводя итоги:
Легко использовать оператор &&
внутри атрибута в HTML-документе, сгенерированном XSLT, указав операнд &&
как &&
Вы выражаете URI в HTML или XHTML? например <tag attr="http://foo.bar/?key=value&key2=value2&..."/>
Если это так, "&
" - это правильный способ выражения амперсанда в значении атрибута, даже если он отличается от обычного URI, который вы хотите. Браузеры будут декодировать "&
" и любую другую ссылку на символ, прежде чем загружать их или передавать их во Flash. Чтобы вставить литеральный текст, одиночный "&
" непосредственно в HTML или XHTML неверен.
Я также лично рекомендую узнать больше об XML, чтобы более четко продумать эти вещи. Например, попробуйте использовать W3C DOM больше (для более чем простого тривиального Javascript); даже если вы не используете его изо дня в день, изучение DOM помогло мне правильно подумать о древовидной структуре XML и о том, как правильно правильно кодировать атрибуты и элементы.
Используйте disable-output-escaping="yes"
в теге value-of
Если вы создаете строку запроса как часть более крупного URL-адреса в атрибуте какого-либо другого тега (например, "embed" ), тогда вы действительно хотите, чтобы и было экранировано как & amp;. Хотя все браузеры выяснят, что вы имеете в виду, и "Делайте правильную вещь", если вы должны передать ваш сгенерированный документ на валидатор, он будет отмечать неэкранированное и значение атрибута.
Если вы пытаетесь создать XML файл в качестве вывода, вы захотите создать &
(поскольку &
на нем собственный недопустимый XML). Если вы просто создаете строку, вы должны установить режим вывода таблицы стилей на text
, включив в качестве дочернего элемента xsl:stylesheet
<xsl:output method="text"/>
Это предотвратит экранирование стилей и <xsl:value-of select="'&'" />
должно произвести &
.
Если ваше преобразование испускает XML-документ, вы не должны отключать выходное экранирование. Вы хотите, чтобы символы разметки были экранированы в выходном файле, чтобы вы не генерировали искаженный XML. Объект XML, обрабатывающий вывод с помощью (например, DOM), будет отменять текст для вас.
Если вы используете строковое манипулирование вместо объекта XML для обработки вывода, у вас есть проблема. Но проблема не в вашем XSLT, а в решении использовать манипуляции с строкой для обработки XML, что почти всегда плохое.
Если ваше преобразование испускает HTML или текст (и вы задали тип вывода в элементе <xsl:output>
, верно?), это другая история. Затем вам нужно использовать disable-output-escaping='yes'
для вашего элемента <xsl:value-of>
.
Но в любом случае вам нужно будет избежать символов разметки в ваших текстовых узлах XSLT, если только вы не обернули текст в разделе CDATA.
Отключить выходное экранирование выполнит задание...... поскольку этот атрибут поддерживается только для текста, вы можете манипулировать шаблоном, например:
<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"..
Просто замените и
<![CDATA[&]]>
в данных. EX: XML данных
<title>Empire <![CDATA[&]]> Burlesque</title>
Тег XSLT:
<xsl:value-of select="title" />
Вывод: Империя и Бурлеск
Использование атрибута disable-output-escaping
(логическое), вероятно, является самым простым способом выполнения этого. Обратите внимание, что вы можете использовать это не только на <xsl:value-of/>
, но также и с <xsl:text>
, который может быть более чистым, в зависимости от вашего конкретного случая.
Здесь соответствующая часть спецификации: http://www.w3.org/TR/xslt#disable-output-escaping
Следует отметить, что вы можете использовать disable-output-escaping в пределах значения node или строки/текста, например:
<xsl:value-of select="/node/here" disable-output-escaping="yes" />
или
<xsl:value-of select="'&'" disable-output-escaping="yes" />
<xsl:text disable-output-escaping="yes">Texas A&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;
внимание мое.
org.apache.xalan.xslt.Process, версия 2.7.2, выводит приведенную выше фразу "Вот беглая, короткая и полная демонстрация того, как создать такой URL":
<?xml version="1.0" encoding="UTF-8"?>http://www.myUrl.com/?vA=a&vX=x&vY=y&vZ=z11522
Декларация XML подавляется дополнительным omit-xml-declaration="yes"
, но, однако, с помощью method="text"
вывода method="text"
экранирование от амперсандов не оправдано.
попробовать: < xsl: значение-select = "& amp;" отключение-выход-маскирование = "да" /" >
Извините, если форматирование перепутано.