Я нашел эту статью, пытаясь решить аналогичную проблему (используя преобразование XSL, чтобы взять один файл XML и создать частичную / подмножественную копию некоторых узлов в нем, как второй файл XML). В моем случае первые XML-файлы имеют некоторые элементы, значения которых полностью заключены в блоки CDATA, потому что они являются JSON и содержат некоторую разметку форматирования HTML.
Я обнаружил, что вместо использования xsl:value-of
я мог бы использовать xsl:copy-of
, и, как указывает @Pavel Minaev, я мог бы сохранить исходный CDATA без изменений, перечислив каждое соответствующее имя элемента в объявлении xsl: output , Это может быть подход, который будет работать для ОП.
XML для копирования (образец):
<text_item>
<id>100</id>
<stem_text><![CDATA[(any string of text, including HTML)]]></stem_text>
<answerOptions><![CDATA[{"choices":[{"label":"Atmospheric O<sub>2</sub>",
"value":"A"},{"label":"Released CO<sub>2</sub>",
"value":"B"}]}]]></answerOptions>
...
</text_item>
Соответствующие строки таблицы стилей:
<xsl:output method="xml" indent="yes" cdata-section-elements="stem_text answerOptions" />
...
<xsl:apply-templates select="//text_item" >
...
<xsl:template match="text_item">
<xsl:element name="text_item" >
<xsl:copy-of select="node()" />
</xsl:element>
</xsl:template>
Атрибут cdata-section-elements
означает, что в выходных данных исходные блоки CDATA в XML, скопированные из , будут переданы как есть в выходной XML-файл при запуске преобразования. Похоже, что вы можете назвать столько элементов, сколько хотите.
В примере ОП, я полагаю, он выберет //node/subNode
, а затем построит элемент с именем text
, внутри newDoc/data
, конечно. Его cdata-section-elements attribute
будет просто ="text"
, в точности как у Павла.