ibm-datapower дает ">" вместо ">" и "<" вместо "<" в результирующем XML для текстовых данных с использованием XSLT - PullRequest
0 голосов
/ 10 июля 2019

В одном из моих приложений я пытаюсь преобразовать ответ моего сервиса с помощью xslt на datapower. В одном из сценариев ответа мне нужно показать что-то вроде XML:

<data contentType="text/xml;charset=utf-8" contentLength="80"><![CDATA[Your request cannot be processed]]></data>

Но мой XSLT не работает на мощности данных и показывает "&gt;" и "&lt;" вместо ">" и "<".

Ниже приведены некоторые из моих шаблонов. Пожалуйста, взгляните и предложите исправления:

Попытка 1: пробовал с "&gt;"&lt;"

<xsl:param name="mask"   select="'Your request cannot be processed'"/>

         <xsl:template match="*" mode="copyFault">
            <xsl:text disable-output-escaping="yes">&lt;data contentType="text/xml;charset=utf-8" contentLength="80"&gt;&lt;![CDATA[</xsl:text>   
            <xsl:value-of select="$mask" />
            <xsl:text disable-output-escaping="yes">]]&gt;&lt;/data&gt;</xsl:text>           
          </xsl:template>

Попытка 2: пробовал со значениями HEX

<xsl:param name="mask"   select="'Your request cannot be processed'"/>
          <xsl:variable name="lessThan" select="'&#x3C;'"/>
          <xsl:variable name="GreaterThan" select="'&#x3E;'"/>

         <xsl:template match="*" mode="copyFault">
            <xsl:value-of  disable-output-escaping = "yes" select="$lessThan"/>
            <xsl:text>data contentType="text/xml;charset=utf-8" contentLength="80"</xsl:text>
            <xsl:value-of disable-output-escaping = "yes" select="$GreaterThan"/>
            <xsl:value-of  disable-output-escaping = "yes" select="$lessThan"/>
            <xsl:text>![CDATA[</xsl:text>
            <xsl:value-of select="$mask" />
            <xsl:text>]]</xsl:text>
            <xsl:value-of disable-output-escaping = "yes" select="$GreaterThan"/>
            <xsl:value-of  disable-output-escaping = "yes" select="$lessThan"/>
            <xsl:text>/data</xsl:text>
            <xsl:value-of disable-output-escaping = "yes" select="$GreaterThan"/>            
          </xsl:template>

Пожалуйста, дайте мне знать, что мне делать, чтобы получить XML в правильном формате от datapower.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

disable-output-escaping - это очень неприятная особенность: она не работает на всех процессорах, и если она вообще поддерживается, она работает только тогда, когда выходные данные преобразования передаются непосредственно в сериализатор с поддержкой XSLT, поэтому это зависит от того, каквы выполняете преобразование.

Намного лучше избегать disable-output-escaping, когда вы можете, и, конечно, нет никаких доказательств того, что вам это нужно здесь.Требование к выводу раздела CDATA несколько необычно (любое хорошо написанное приложение, читающее XML, не заботится о том, находится ли текст в разделе CDATA или нет), но если оно вам действительно нужно, то обычно это можно сделать, используя * 1005.*.(Хотя, опять же, это работает только в том случае, если вывод подается в сериализатор с поддержкой XSLT.)

Конечно, генерация начальных и конечных тегов с использованием disable-output-escaping - очень плохая практика.

0 голосов
/ 10 июля 2019

Обычный способ в XSLT вывести определенный элемент XML - это буквальный элемент результата, поэтому с помощью

<data contentType="text/xml;charset=utf-8" contentLength="80">Your request cannot be processed</data>

в вашем XSLT будет выводить этот элемент в результате. Если вы хотите заполнить элемент переменной или значением параметра, используйте, например,

<data contentType="text/xml;charset=utf-8" contentLength="80"><xsl:value-of select="$mask"/></data>

Если процессор XSLT отвечает за сериализацию результата в файл или строку, и вы хотите, чтобы некоторый элемент, такой как элемент data, имел раздел CDATA в качестве содержимого, тогда объявите, например, <xsl:output cdata-section-elements="data"/> как потомок xsl:stylesheet (или xsl:transform, если вы назвали корневой элемент таким образом).

...