2009-10-01 3 views
7

Я пытаюсь преобразовать документ с содержимым, как показано ниже, в другой документ, оставив CDATA точно так же, как в первом документе, но я не понял, как для сохранения CDATA с XSLT.Преобразование XML с XSLT и сохранение CDATA (в Ruby)

Initial XML:

<node> 
    <subNode> 
     <![CDATA[ HI THERE ]]> 
    </subNode> 
    <subNode> 
     <![CDATA[ SOME TEXT ]]> 
    </subNode> 
</node> 

Final XML:

<newDoc> 
    <data> 
     <text> 
      <![CDATA[ HI THERE ]]> 
     </text> 
     <text> 
      <![CDATA[ SOME TEXT ]]> 
     </text> 
    </data> 
</newDoc> 

Я пытался что-то подобное, но не повезло, все не получает перемешалось:

<xsl:element name="subNode"> 
    <xsl:value-of select="." disable-output-escaping="yes"/> 
</xsl:element> 

Любые идеи, как сохранить CDATA?

Спасибо! Lance

Использование рубиновый/nokogiri

Update: Вот то, что работает.

<text disable-output-escaping="yes">&lt;![CDATA[</text> 
<value-of select="normalize-space(text())" disable-output-escaping="yes"/> 
<text disable-output-escaping="yes">]]&gt;</text> 

Это будет обернуть весь текст() узлы в CDATA, который работает для того, что мне нужно, и она будет сохранять HTML-теги в тексте.

ответ

5

Вы не можете сохранить точную последовательность узлов CDATA, если они смешаны с текстовыми узлами. В лучшем случае, вы можете заставить все содержимое определенного элемента на выходе будет CDATA, перечисляя, что имя элемента в xsl:output/@cdata-section-elements:

<xsl:output cdata-section-elements="text"/> 
+0

Должен ли я просто использовать ruby ​​и, возможно, регулярные выражения для их предварительной обработки до того, как я сделаю xslt или что-то в этом роде? Как еще вы это сделаете? Элементы cdata-section не совсем режут его, потому что я использую переменные и тому подобное. Спасибо за подсказку. –

+0

Если вам абсолютно нужна CDATA, вам придется искать что-то другое, кроме XSLT. Тем не менее, мне очень любопытно, почему вам это нужно. XDM не различает текст и CDATA по очень веской причине - никакое здравомыслящее приложение для обработки XML никогда не должно давать для них другую семантику, поэтому CDATA и экранирование символов должны использоваться взаимозаменяемо. –

+0

Я использую эти данные во Flash, и я слышал, что с CDATA/CDATA нет проблем. Я еще не пробовал еще: p –

3

Извините, опубликовать ответ на свой вопрос, но я нашел то, что работает :


<text disable-output-escaping="yes">&lt;![CDATA[</text> <value-of select="normalize-space(text())" disable-output-escaping="yes"/> <text disable-output-escaping="yes">]]&gt;</text> 

это будет обернуть весь текст() узлы CDATA, которая работает для того, что мне нужно, и она будет сохранять HTML-теги в тексте.

+0

Я предполагаю, что это способ получить узел CDATA специально для вывода (за исключением того, что вы можете получить ']]>' в input 'text()', и в этом случае он не будет скорее делайте то, что вы ожидаете), но я не вижу, как это позволит вам сохранить узлы CDATA, которые были там, в первую очередь, поскольку у вас по-прежнему нет возможности различать входные текстовые узлы от входных узлов CDATA. В противном случае я не вижу, как это отличается от 'cdata-section-elements' ... –

Смежные вопросы