Я пытаюсь создать строку запроса переменных заданий разделены по &
символа (например: "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, который выводится различными (или даже «поврежден»), чем один выход в первой трансформации?
Ответ:
Нет, в обоих случаях та же строка выводился - однако в каждом случае был использован другой представление строки.
Вопрос:
Должен ли я использовать (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 внутри атрибута, представляя его как &&
Вот полный пример, что каждый может как я сделал в трех браузерах: 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
, вы сразу получить окончательный результат операции &&
:
Второе предупреждение пропускается, поскольку первый операнд &&
операции был false
и JavaScript является shortcutting в &&
где первый операнд является false
.
Резюмируя:
Легко использовать оператор &&
внутри атрибута в HTML-документа, сформированного XSLT, указав &&
операнд как &&
Что такое четвёртое тег этого вопроса? Я просто думаю, что это должно быть обслужено ... – 2008-09-15 23:18:08
Два пробела в конце, казалось, сделали второе пространство его тегом. – grapefrukt 2008-09-16 07:23:45
@DimitreNovatchev Действительно, его исчерпывающий ответ и многое другое. Я попробую это на работе. – 2015-10-13 06:14:13