Как показать

#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. Если вы уже знали ответ, вам не следовало задавать этот вопрос. Это пустая трата моего времени. Я пытался быть полезным кому-то, кто, как я думал, был бы признателен. Пожалуйста, подумайте более тщательно в будущем