Как заставить преобразование xslt загрузить данные в разделы cdata? - PullRequest
3 голосов
/ 27 февраля 2012

У меня есть клиент, которому требуется, чтобы весь текст в xml, который я им предоставляю, был в разделах CDATA.Я понимаю, что текст не должен быть в CDATA, поскольку он уже был проанализирован и преобразован, когда он передается клиенту.Однако, как бы я ни был уверен, им все равно нужны разделы CDATA.Вздох.

Я обрабатываю свои данные с помощью Saxon 9.3, используя команду преобразования командной строки.

Ответы [ 2 ]

4 голосов
/ 27 февраля 2012

Так как заголовок вашего вопроса говорит о XSLT, а ваш вопрос помечен как XSLT, способ XSLT обеспечить сериализацию содержимого элемента результата в виде раздела CDATA состоит в использовании атрибута cdata-section-elements в элементе xsl:output (http://www.w3.org/TR/xslt20/#serialization) перечисление всех элементов, которые вы хотите вывести в виде разделов CDATA. Таким образом, если вы знаете элементы, которые вы хотите вывести в виде разделов CDATA при написании таблицы стилей, это просто, если перечислить их в этом атрибуте. Помогает ли это?Вы хотите постобработать произвольный XML с помощью XSLT для добавления разделов CDATA?

2 голосов
/ 27 февраля 2012

Вот полный пример :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"
 cdata-section-elements="num"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

, когда это преобразование применяется к следующему образцу XML-документа:

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

результатимеет все текстовые узлы (все они являются дочерними элементами num элементов), представленные в разделах CDATA :

<nums>
   <num><![CDATA[01]]></num>
   <num><![CDATA[02]]></num>
   <num><![CDATA[03]]></num>
   <num><![CDATA[04]]></num>
   <num><![CDATA[05]]></num>
   <num><![CDATA[06]]></num>
   <num><![CDATA[07]]></num>
   <num><![CDATA[08]]></num>
   <num><![CDATA[09]]></num>
   <num><![CDATA[10]]></num>
</nums>

Пояснение :

  1. Использование правила идентификации для вывода каждого узла как есть.

  2. Использование атрибута cdata-section-elements в xsl:output для указания разделенного пробелами списка элементов, текстовый узел которогодочерние элементы должны быть сериализованы как секции CDATA.

Примечание : в вашем случае было бы удобно вообще не изменять существующие преобразования, а иметь пост-процесс обработки их результатов, аналогичный этому примеру.

...