Как загрузить дочерние элементы XML из другого XML-файла

#xml

#xml

Вопрос:

У меня есть 3 XML-файла:

main.xml:

 <page>
 <title>main page</title>
 <elements></elements>
 <templates></templates>
</page>
  

elements.xml:

 <elements>
 <element_1>element 1</element_1>    
 <element_2>element 2</element_2>
</elements>
  

templates.xml:

 <templates>
 <template_1>template 1</template_1>    
 <template_2>template 2</template_2>
</templates>
  

Возможно ли загрузить main.xml и увидеть все <elements> из elements.xml внутри <elements></elements> узла main.xml и все <templates> из templates.xml внутри <templates></templates> узла main.xml ?

Итак, в конце, main.xml выводился бы следующим образом:

 <page>
 <title>main page</title>
 <elements>
  <element_1>element 1</element_1>    
  <element_2>element 2</element_2>
 </elements>
 <templates>
  <template_1>template 1</template_1>    
  <template_2>template 2</template_2>
 </templates>
</page> 
  

Должен ли я использовать файл xsl? Не могли бы вы, пожалуйста, привести мне пример того, как это будет работать?

Мне нравится избегать использования языка на стороне сервера, но если это строго необходимо, я буду использовать PHP.

Ответ №1:

Если у вас есть контроль над основным файлом, вы могли бы просто использовать XInclude, а затем использовать анализаторы и процессоры, которые знают о XInclude.

В противном случае XSLT может включать вторичные исходные документы с использованием функции document(). Следующая таблица стилей должна выполнять то, что вы ищете:

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

  <xsl:template match="elements">
    <xsl:copy-of select="document('elements.xml')"/>
  </xsl:template>

  <xsl:template match="templates">
    <xsl:copy-of select="document('templates.xml')"/>
  </xsl:template>

  <xsl:template match="*">
    <xsl:copy>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
  

Комментарии:

1. Спасибо, Роберт. Я пошел с document() , и это работает как шарм. Еще раз спасибо.