сопоставление xml с XSLT: блокировщик CDATA - PullRequest
0 голосов
/ 28 августа 2018

С тех пор я всегда пытался получить содержимое элемента "test" из следующего XML-файла, используя XSLT, но я действительно заблокирован.

У вас есть идея, как получить его с помощью XSLT

Содержимое файла XML следующее:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <BusinessResponse>
         <BusinessResult><![CDATA[<?xml version="1.0" encoding="UTF-8"?><test>helloWorld</test>]]></BusinessResult>
      </BusinessResponse>
   </soap:Body>
</soap:Envelope>

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

С XSLT 3.0 вы можете использовать функцию parse-xml(), чтобы проанализировать текст как XML, а затем вы можете ввести XPath в структуру, чтобы получить элемент <test> или его /test/text() текстовый узел:

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <xsl:output omit-xml-declaration="yes" indent="yes" />

  <xsl:template match="/">
    <xsl:sequence select="parse-xml(/soap:Envelope/soap:Body/BusinessResponse/BusinessResult)/test"/>
  </xsl:template>

</xsl:stylesheet>

С XSLT 1.0 или выше, если ваш контент действительно такой простой, и вам нужен только текстовый узел внутри элемента <test>, вы можете использовать substring-before() и substring-after():

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <xsl:output omit-xml-declaration="yes" indent="yes" />

  <xsl:template match="/">
    <xsl:value-of 
        select="substring-before(
                  substring-after(/soap:Envelope/soap:Body/BusinessResponse/BusinessResult,
                     '&lt;test>'), 
                  '&lt;/test>')" />            
  </xsl:template>

</xsl:stylesheet>

Если вам нужно уметь выполнять что-то более сложное и вам нужны все возможности XSLT и XPath, то вы можете достичь этого с помощью двух преобразований. Первое преобразование для сериализации text() BusinessResult в виде XML с использованием xsl:value-of с disable-output-escaping="yes":

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <xsl:output omit-xml-declaration="yes" indent="yes" />

  <xsl:template match="/">
    <xsl:value-of select="/soap:Envelope/soap:Body/BusinessResponse/BusinessResult" disable-output-escaping="yes" />            
  </xsl:template>

</xsl:stylesheet>

Который производит:

<?xml version="1.0" encoding="UTF-8"?><test>helloWorld</test>

Если при обработке конверта SOAP вы хотели использовать это с другой структурой XML, вам может потребоваться исключить объявление XML:

substring-after(/soap:Envelope/soap:Body/BusinessResponse/BusinessResult,'?>')

А затем используйте второй XSLT, чтобы выбрать и обработать то, что вы хотите из этого вывода XML

0 голосов
/ 28 августа 2018

Попробуй так:

<xsl:value-of select="BusinessResult" disable-output-escaping="yes"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...