Как мне объединить пару xml-файлов в один XML-файл с помощью xslt?

#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().