Как установить исключение в xslt для специального элемента для CDATA - PullRequest
0 голосов
/ 03 апреля 2020

вот в чем дело. У меня есть Viewer, который может читать XML, а также html. Теперь я хочу добиться следующего. Я хочу, чтобы текст из <note> был преобразован в CDATA (проверка), но если в <note> используется конкретный c элемент, * давайте назовем элемент <html>, весь текст в этом элементе не должен быть преобразован в CDATA.

Возможно ли это вообще? Я уже пробовал разные вещи, но пока не нашел решения, которое помогло бы мне в моем случае.

Входные данные таковы:

<infobox>
 <title>HTML TEST</title>
   <note><b>XML in the Note</b><html html="yes">&lt;h1&gt;Headline&lt;/h1&gt;
         &lt;h2 style="color:green"&gt; Grüne Schrift &lt;/h2&gt;
         &lt;h3 style="color:black"&gt; Schwarze Schrift &lt;/h3&gt;
         &lt;h4 style="color:#FF0000"&gt; Rote Schrift &lt;/h4&gt;</html>
   </note>
</infobox>

My Часть XSL для заметки такова:

    <xsl:template match="note[not(ancestor::info) and not(ancestor::item-content) and not(ancestor::context)]">
      <note type="{@type}">
        <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
        <div class="{$noteClass}">
        <xsl:apply-templates/>
        </div>
        <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
      </note>
    </xsl:template>

Мой опубликованный результат таков:

      <infobox>
        <title id="CAP0e6ba25c-a8a1-45fb-a957-43c3195f9c326">HTML TEST</title>
        <note type=""><![CDATA[<div class="NoteContent">
                  <b>XML in the Note</b>
                  <html>&lt;<div class="html-content">&lt;h1&gt;Headline&lt;/h1&gt;&lt;h2 style="color:green"&gt; Grüne Schrift &lt;/h2&gt;
&lt;h3 style="color:black"&gt; Schwarze Schrift &lt;/h3&gt;
&lt;h4 style="color:#FF0000"&gt; Rote Schrift &lt;/h4&gt;</div>]]&gt;</html>
               </div>]]></note>
      </infobox>

Мой разыскиваемый опубликованный результат такой :

      <infobox>
        <title id="CAP0e6ba25c-a8a1-45fb-a957-43c3195f9c326">HTML TEST</title>
        <note type=""><![CDATA[<div class="NoteContent">
                  <b>XML in the Note</b></div>]]><html>&lt;h1&gt;Headline&lt;/h1&gt;&lt;h2 style="color:green"&gt; Grüne Schrift &lt;/h2&gt; &lt;h3 style="color:black"&gt; Schwarze Schrift &lt;/h3&gt; &lt;h4 style="color:#FF0000"&gt; Rote Schrift &lt;/h4&gt;</html>

        </note>
      </infobox>

Итак, вы видите, что элемент <html> должен быть исключен из преобразования.

Я открыт для любого предложения по редактированию показанной части xsl или для любой дополнительный ввод xsl.

Спасибо всем.

1 Ответ

1 голос
/ 03 апреля 2020

Выбор элементов не html и упаковка их в сериализованный div легко возможна в XSLT 3:

<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:template match="note/*[not(self::html)]">
      <xsl:variable name="div-wrapper" as="element(div)">
          <div class="note">
              <xsl:apply-templates/>
          </div>          
      </xsl:variable>
      <xsl:value-of select="serialize($div-wrapper)"/>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/a9GPfA

Создание разделов CDATA может быть делегировано <xsl:output cdata-section-elements="note"/>, см. https://xsltfiddle.liberty-development.net/a9GPfA/1, но, как вы можете видеть, там сложнее контролировать то, что происходит с контентом только с пробелами внутри note, в ваш образец вы получите раздел CDATA с пробелом после элемента html.

...