Присвойте результат переменной, содержащей специальные символы, используя encode-for-uri, переменной - PullRequest
0 голосов
/ 24 сентября 2019

Я запрашиваю Microsoft Dynamics, используя fetchXML.Их запрос создается динамически с использованием XML-подобного синтаксиса.

Упрощенный пример:

<fetch version="1.0" mapping="logical" page="1" count="5" returntotalrecordcount="true"><entity name="msdyn_bookingjournal"><attribute name="msdyn_name"/><attribute name="msdyn_starttime"/><attribute name="msdyn_endtime"/></entity></fetch>

Результат присваивается параметру url fetchXml и должен быть закодирован в URL-адресе.fetchXML =% 3Cfetch% 20version% 3D% 221,0% 22% 20mapping% 3D% 22logical% 22% 20page% 3D% 221% 22% 20count% 3D% 225% 22% 20returntotalrecordcount% 3D% 22true% 22% 3E% 3Centity% 20name% 3D% 22msdyn_bookingjournal% 22% 3E% 3Cattribute% 20name% 3D% 22msdyn_name% 22% 2F% 3E% 3Cattribute% 20name% 3D% 22msdyn_starttime% 22% 2F% 3E% 3Cattribute% 20name% 3D% 22msdyn_endtime% 22% 2F% 3E% 3C% 2Fentity% 3E% 3C% 2Ffetch% 3E

Я хочу выполнить URL-кодирование в XSLT с использованием encode-for-uri, однако структура, подобная XML, выдает ошибки синтаксического анализа при сохранении в Notepad ++: «XMLОшибка синтаксического анализа в строке 15: дополнительное содержимое в конце документа 'или xsltfiddle"xsl: value-of" не должно содержать символ "<". </p>

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:hci="http://sap.com/it/"
exclude-result-prefixes="hci"
version="2.0">
<xsl:output method="xml" indent="yes" encoding="utf-8" />
<!-- https://enlightenedintegration.wordpress.com/2018/02/27/cpi-updating-message-headers-and-property-through-xslt/ -->
<!-- needed to call the functions for setting header and propert values -->
<xsl:param  name="exchange"/>
<xsl:param name="MSDQuery"/>
<xsl:param name="MSDHost" />
<xsl:param name="query"/>
<xsl:variable name ="encodedQuery"><xsl:value-of select="encode-for-uri('<fetch version=1.0 mapping=logical page=1 count=10>' + $query + '</fetch>')"/></xsl:variable>
<xsl:template match="/">
    <xsl:value-of select="hci:setProperty($exchange, 'MSDQuery', $encodedQuery)" />
</xsl:template>
</xsl:stylesheet>

Как можноэтот запрос будет закодирован с помощью encode-for-uri?

Я создал скрипку: https://xsltfiddle.liberty -development.net / ncntCRX

Примечание:

  • Значения параметров присваиваются во время выполнения на лету
  • Я уже пропустил двойные кавычки в запросе, пример version = "1.0" при вызовефункция

1 Ответ

1 голос
/ 24 сентября 2019

Сообщение об ошибке ясно. Это не правильно сформированный XML :

<xsl:value-of select="encode-for-uri('<fetch version=1.0 mapping=logical page=1 count=10>' + $query + '</fetch>')"/>

Используя сущности, это правильно сформированный XML:

<xsl:value-of select="encode-for-uri('&lt;fetch version=1.0 mapping=logical page=1 count=10>' + $query + '&lt;/fetch>')"/>

Примечание :$query должна быть строкой, и она не должна быть «XML escape-», если она не определена в контексте XML.

...