#xml #xslt
#xml #xslt
Вопрос:
Мне нужно объединить пару XML-файлов в один, используя XSLT. У меня есть 4 XML-файла release, reception, theatre1 и theatre2. сначала должен быть добавлен релиз, затем его соответствующий прием должен быть размещен внутри части выпуска. Затем следует добавить два других.
вот формат файлов. релиз: текст
прием: текст
результатом должно быть: < текстовый текст
Вот что у меня есть на данный момент, но это работает не полностью
Остальные 2 файла просто нужно добавить в конце
Комментарии:
1. Вы не предоставили ни одного из XML-файлов! Пожалуйста, исправьте.
Ответ №1:
Вот как действовать:
$ expand -t2 release.xml
<release name="bla"/>
$ expand -t2 reception.xml
<receptions>
<reception name="bla">
<blabla/>
</reception>
<reception name="blub">
<blubbel/>
</reception>
</receptions>
$ expand -t2 theatre1.xml
<theatre number="1"/>
$ expand -t2 theatre2.xml
<theatre number="2"/>
$ expand -t2 release.xsl
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/><!-- make output look nice -->
<xsl:output indent="yes"/>
<xsl:template match="release">
<xsl:variable name="rel-name" select="@name"/>
<xsl:copy>
<xsl:copy-of select="node()"/><!-- copy remainder of doc -->
<xsl:copy-of select="document( 'release.xml' )"/>
<xsl:variable name="rcpt-doc" select="document( 'reception.xml' )"/>
<xsl:copy-of select="$rcpt-doc/*/reception[ @name = $rel-name ]"/>
<xsl:copy-of select="document( 'theatre1.xml' )"/>
<xsl:copy-of select="document( 'theatre2.xml' )"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Назовите это следующим образом:
xsltproc release.xsl release.xml
Вот результат:
<?xml version="1.0"?>
<release>
<release name="bla"/>
<reception name="bla">
<blabla/>
</reception>
<theatre number="1"/>
<theatre number="2"/>
</release>
Ответ №2:
Чтение нескольких входных документов, похоже, отвечает на этот вопрос.
Когда вы запускаете процессор XSLT, вы указываете ему, где найти исходный документ дерева — возможно, в файле на диске на локальном или удаленном компьютере — и таблицу стилей для применения к нему. Вы не можете указать процессору применить таблицу стилей к нескольким входным документам одновременно. Однако функция document() позволяет таблице стилей указывать имя дополнительного документа для чтения. Вы можете вставить весь документ в результирующее дерево или вставить его часть на основе условия, описываемого выражением XPath. Вы даже можете использовать эту функцию с инструкцией xsl: key и функцией key() для поиска значения ключа в документе за пределами вашего исходного документа.
Следовательно, ключом к загрузке нескольких документов в xslt является использование функции document().