Как написать xslt в xml, который содержит <> вместо '<' и '>' - PullRequest
0 голосов
/ 01 мая 2018

Например, я звоню в веб-службу, которая дает мне следующий ответ:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Header/>
    <soapenv:Body>
        <executeResponse>
            <executeReturn>
                &lt;Message&gt;
                    &lt;Body&gt;
                        &lt;Clients&gt;
                            &lt;Client&gt;
                                &lt;ClientID&gt;C000001&lt;/ClientID&gt;
                            &lt;/Client&gt;
                            &lt;Client&gt;
                                &lt;ClientID&gt;C000002&lt;/ClientID&gt;
                            &lt;/Client&gt;
                        &lt;/Clients&gt;
                    &lt;/Body&gt;
                &lt;/Message&gt;
            </executeReturn>
        <executeResponse>
    </soapenv:Body>
</soapenv:Envelope>

Как написать XSLT, чтобы я мог преобразовать ответ на это:

<Customers>
    <Customer>
        <CustomerID>C000001<CustomerID>
        <CustomerID>C000002<CustomerID>
    <Customer>
<Customers>

1 Ответ

0 голосов
/ 01 мая 2018

Если у вас есть доступ к процессору XSLT 3, например, Saxon 9.8, вы можете использовать функцию parse-xml, чтобы проанализировать экранированную разметку в узлы XML, а затем преобразовать их так, чтобы

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="3.0">

  <xsl:strip-space elements="*"/>
  <xsl:output indent="yes"/>

  <xsl:mode on-no-match="text-only-copy"/>

  <xsl:template match="executeReturn">
      <xsl:apply-templates select="parse-xml(.)"/>
  </xsl:template>

  <xsl:template match="Clients">
      <Customers>
          <Customer>
              <xsl:apply-templates/>
          </Customer>
      </Customers>
  </xsl:template>

  <xsl:template match="ClientID">
      <CustomerID>
          <xsl:apply-templates/>
      </CustomerID>
  </xsl:template>

</xsl:stylesheet>

преобразует ваш ввод в https://xsltfiddle.liberty -development.net / eiZQaF2 в

<?xml version="1.0" encoding="UTF-8"?>
<Customers>
   <Customer>
      <CustomerID>C000001</CustomerID>
      <CustomerID>C000002</CustomerID>
   </Customer>
</Customers>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...