Xslt создает несколько тегов <name>с CDATA, а некоторые теги <name>без? - PullRequest
2 голосов
/ 31 августа 2010

Резюме: я использую xslt для преобразования данных, и мне нужно создать некоторые теги с CDATA внутри, а некоторые без. Выход из разделов CDATA - мой единственный выбор?

Я пытаюсь преобразовать данные, которые у меня уже есть в xml, в Moodle Xml для импорта. Конечный продукт должен включать в себя немного Html, который, в частности, Moodle Xml doc должен содержать в CDATA.

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

<question>
  <name>
    <text>FooName</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<img src="1.png">]]></text>
  </questiontext>
</question>

Я попробовал использовать следующий код (урезанный, но включающий данные из моего входного XML-файла):

Метод 1, ничего особенного

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

  <xsl:template match="/">
    <question>
      <name>
        <text>FooName</text>
      </name>
      <questiontext format="html">
        <text><![CDATA[<img src="1.png">]]></text>
      </questiontext>
   </xsl:template>

</xsl:stylesheet>

И получил ...

Плохой вывод из метода 1

<question>
  <name>
    <text>FooName</text>
  </name>
  <questiontext format="html">
    <text>&lt;img src="1.png"&gt;</text>
  </questiontext>
</question>

Итак, я смотрю xslt документацию и некоторые вопросы SO , которые, кажется, говорят, у меня есть 2 варианта:

  1. Ничего не делать, CDATA экранируется.
  2. использовать cdata-section-elements ="text" для автоматической генерации разделов cdata внутри тегов
  3. Создание разделов CDATA вручную, используя disable-output-escaping="yes"

Хорошо, автогенерация звучит хорошо. Давайте попробуем это:

Метод 2 добавления cdata-section-elements="text"

<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" cdata-section-elements="text"/>

Неверный вывод из cdata-section-elements ="text":

<question>
  <name>
    <text><![CDATA[FooName]]></text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<img src="1.png">]]></text>
  </questiontext>
</question>

Так что 2 не вариант, потому что есть другие элементы, которые я НЕ хочу, содержащие CDATA, в схеме, которую я не контролирую.

Это оставляет мне вариант 3, избегая его вручную. Тогда мой вопрос: является ли вариант 3 моим единственным вариантом? Что еще я могу сделать, чтобы получить желаемый результат, используя XSLT? не используете XSLT?

Ответы [ 3 ]

5 голосов
/ 16 августа 2011

Я нашел этот метод на http://neehouse.com/code/xslt/cdata_string_output.aspx

Код

<no1>
    <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
    <xsl:value-of select="data/NO1"/>
    <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
</no1>

Вывод

<no1><![CDATA[xxxxxxxxxxxx]]></no1>
0 голосов
/ 31 августа 2010

Поскольку у Димитра есть ответ, ваше требование странное, потому что в элементах XML имена имеют смысл схемы.Если text схема элементов допускает CDATA, это так для всех text элементов.

Один способ сделать то, что вы хотите с дополнительным элементом:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<xsl:output cdata-section-elements="xhtml:div"/>
    <xsl:template match="/">
        <question>
            <name>
                <text>FooName</text>
            </name>
            <questiontext format="html">
                <text>
                     <xhtml:div><![CDATA[<img src="1.png">]]></xhtml:div>
                </text>
            </questiontext>
        </question>
    </xsl:template>
</xsl:stylesheet>

Вывод (с любым вводом):

<question xmlns:xhtml="http://www.w3.org/1999/xhtml">
    <name>
        <text>FooName</text>
    </name>
    <questiontext format="html">
        <text>
            <xhtml:div><![CDATA[<img src="1.png">]]></xhtml:div>
        </text>
    </questiontext>
</question>
0 голосов
/ 31 августа 2010

Как вы заметили, ваш метод 1 и метод 2 не дали желаемого результата.

Из-за чрезвычайно странного и редкого требования к выходному лексическому виду у вас остается только 3-й метод.

...