#xml #xslt
#xml #xslt
Вопрос:
Сначала я хочу указать свою цель. Мне поручено показать URL-адрес, связанный с постоянной строкой, в частности, ‘amp;src=JB-10081’ в качестве атрибута XML-тега в выходных данных.
Вот мой код:
<vacancy>
<xsl:attribute name = "url">
<xsl:value-of disable-output-escaping="yes" select="concat(apply_url, 'amp;amp;src=JB-10081')"/>
</xsl:attribute>
<vacancy>
Этот код дает мне результат:
<vacancy id="6747232000011108" datestart="" dateend="" language="" origin="" url="https://dtt.taleo.net/careersection/10540/jobapply.ftl?lang=en-GBamp;amp;job=27050amp;amp;src=JB-10081">
вы могли заметить, что URL-адрес и строковый литерал отображаются правильно, за исключением того, что вывод, показанный для строкового литерала, не был изменен на amp; и вместо этого показан как amp;amp; может кто-нибудь помочь мне показать его как amp;, а не amp;amp;
Комментарии:
1. В вашем выводе нет ничего плохого. amp; сам по себе будет ошибкой
2. XML содержит несколько зарезервированных символов, включая ‘amp;’ . Это используется для создания ссылок на символьные сущности, такие как ‘, который является апострофом. Созда йте желаемый результат и считайте его в XML-процессор, и он не сможет проанализировать. Не во лнуйтесь, там есть один символ, но он не может отображаться как amp; из-за самого языка XML. Прочи тайте несколько руководств или спецификацию
3. @AllanChua Ваш вывод верен. Если у вас есть один amp;, это недопустимый xml.
4. @AllanChua: вы можете создать любой текст
<xsl:output method="text"/>
. Однако, если вы создаете текст `<someElement someAttribute=»что-то с неэкранированным amp;»/> , то сгенерированный текст не является хорошо оформленным XML-документом. Помните: невозможно создать такой хорошо сформированный XML-документ, потому что по определению XML-документ не может содержать неэкранированный амперсанд, который не является частью ссылки на сущность. Любые комментарии и инструкции по обработке могут содержать такой неэкранированный амперсанд.5. @AllanChua: прочитайте спецификацию W3C XSLT 1.0: вы можете использовать D-O-E для создания неэкранированного содержимого только как часть текстовых узлов, а не в атрибутах. w3.org/TR/1999/REC-xslt-19991116#disable-output-escaping » Это ошибка, из-за которой экранирование вывода отключается для текстового узла, который используется для чего-то другого, кроме текстового узла в дереве результатов. Таким образом, ошибка в отключении экранирования вывода для элемента xsl:value-of или xsl:text, который используется для генерации строкового значения комментария, инструкции обработки или узла атрибута ; »
Ответ №1:
Вы можете использовать D-O-E для создания неэкранированного содержимого только как часть текстовых узлов, а не в атрибутах.
http://w3.org/TR/1999/REC-xslt-19991116#disable-output-escaping :
«Это ошибка, из-за которой выходное экранирование должно быть отключено для текстового узла, который используется для чего-то другого, кроме текстового узла в дереве результатов. Таким образом, ошибка в отключении экранирования вывода для элемента xsl:value-of или xsl:text, который используется для генерации строкового значения комментария, инструкции обработки или узла атрибута; «
Комментарии:
1. Спасибо за помощь. Я бы объяснил это своему ТУПОМУ клиенту 🙂
Ответ №2:
Я заполнил свой ответ выше. XML содержит несколько зарезервированных символов, включая ‘amp;’ . XML использует его для создания ссылок на сущности. Таким образом
<a b="amp;foo;"/>
инструктирует анализатор XML найти объект с именем ‘foo’. Если вы не используете amp;...;
конструкцию, вы получите сообщение об ошибке. Попробуйте прочитать
<a b="amp;src"/>
в любой анализатор XML, и он должен выдать ошибку. Таким образом, результат, который вы хотите создать, является незаконным XML.
Если вы хотите создать строку, ОТЛИЧНУЮ от XML, вам придется выводить в виде текста.
Комментарии:
1. Я знаю этот материал, приятель. Но ТУПЫЕ клиенты были слишком настойчивы. lol 🙂
2. Если вы уже знали ответ, вам не следовало задавать этот вопрос. Это пустая трата моего времени. Я пытался быть полезным кому-то, кто, как я думал, был бы признателен. Пожалуйста, подумайте более тщательно в будущем