Разбор HTML внутри блока CDATA с использованием файла XSL - PullRequest
0 голосов
/ 01 февраля 2019

Я бы хотел проанализировать HTML-код внутри блока CDATA для тегов <p> и вывести каждый из них в отдельную строку таблицы.Однако я не могу понять это, и мне было интересно, сможет ли кто-нибудь мне помочь?

Я пытаюсь разобрать HTML, но не могу понять, как я могу разобрать его, а что нет.просто расцените это как символьные данные.Я почти уверен, что не могу сделать это с XSL 1.0, я могу использовать 2.0 при необходимости.

XML

<XML_FILE>
  <NOTE>
    <TEXT TITLE="TEST">
      <![CDATA[<p>first p tag and <strong>bold</strong></p><p>second p tag and  <u>underline</u></p>]]>
    </TEXT>
  </NOTE>
</XML_FILE>

XSL

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:template match="NOTE">
    <div class="tableWrapper">
      <table class="body">
        <xsl:apply-templates select="TEXT"/>
      </table>
    </div>
  </xsl:template>

  <xsl:template match="TEXT">
    <xsl:value-of select="." disable-output-escaping="yes"/>
  </xsl:template>

</xsl:stylesheet>

Выход

<div class="tableWrapper">
   <table class="body"><p>first p tag and <strong>bold</strong></p><p>second p tag and <u>underline</u></p></table>
</div>

Желаемый выход

<div class="tableWrapper">
   <table class="body">
      <tr><td><p>first p tag and <strong>bold</strong></p></td></tr>
      <tr><td><p>second p tag and <u>underline</u></p></td></tr>
   </table>
</div>

Окончательная таблица стилей, которая обеспечивает желаемый результат

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

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

  <xsl:output method="html" indent="yes" html-version="5"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="NOTE">
    <div class="tableWrapper">
      <table class="body">
        <xsl:apply-templates select="parse-xml-fragment(TEXT)/node()"/>
      </table>
    </div>
  </xsl:template>

  <xsl:template match="p">
      <tr>
          <td>
              <xsl:next-match/>
          </td>
      </tr>
  </xsl:template>

</xsl:stylesheet>

1 Ответ

0 голосов
/ 01 февраля 2019

XSLT 3.0 имеет функцию parse-xml-fragment(), которая решит эту проблему.

Нет ничего эквивалентного в более ранних версиях XSLT, хотя вы можете найти расширения поставщиков, которые вам помогут.Большинство процессоров позволяют вам писать собственные внешние функции, которые вы можете вызывать из кода XSLT, и вы можете написать такую ​​функцию, которая передавала содержимое CDATA во внешний синтаксический анализатор XML для преобразования в древовидную структуру.

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