Я пытаюсь создать строку запроса переменных назначений, разделенных
по символу &
(например: "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&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
- как (часть) текстового узла в правильно сформированном документе XML или в дереве HTML.
По определению в правильно сформированном XML-документе буквальный амперсанд должен экранироваться символьной ссылкой, такой как встроенная &
или &
, или &
Помните : строка, представленная как (часть) текстового узла 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&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-адрес, который выводится, отличным (или даже "поврежденным") от 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?');" />
я могу сделать следующее: я могу поместить подтверждения в функцию ... но ее
Дайте мне понять, что я не могу создать атрибут & inside! Решение
я думаю, что этот вопрос решает мою проблему.
Ответ
На самом деле вы можете указать логическую операцию &&
внутри выражения 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, указав операнд &&
как &&