Я пытаюсь создать строку запроса для присвоений переменных, разделенных символом &
(например: "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. Вы также можете попробовать использовать разные escape-последовательности для амперсанда. Трансформация теперь может выглядеть так:
<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?');" />
что я могу сделать, так это: я могу разместить подтверждения в функции ... но меня беспокоит то, что я не могу создать & внутри атрибута! Думаю, решение этого вопроса - это решение моей проблемы.
Ответ
Фактически, вы можете указать логическую операцию &&
внутри выражения 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, легко использовать, указав операнд &&
как &&
person
Dimitre Novatchev
schedule
13.10.2015
<xsl:output method="text"/>
или<xsl:output method="xml"/>
? - person Flynn1179   schedule 15.10.2015