XML: как загрузить содержимое одного XML-файла в другой

#xml #xslt #xquery #dtd #xlink

#xml #xslt #xquery #dtd #xlink

Вопрос:

Я просто хотел бы иметь возможность динамически записывать содержимое xml-файла из другого XML-файла.

A.XML содержит:

 <?xml version="1.0"?>
<node>
-Include Contents of b.xml
</node>
  

B.XML содержит:

 <anode>
a
</anode>
  

есть ли какой-либо способ сделать это в xml?

Конечный продукт выглядит следующим образом:

 <?xml version="1.0"?>
<node>
  <anode>
    a
  </anode>
</node>
  

Обновление из комментариев:

Только в xml. чтобы при просмотре XML-файла в браузере он отображался корректно

Ответ №1:

Используйте внешнюю (анализируемую) общую сущность для ссылки b.xml на a.xml .

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE node [
<!ENTITY b SYSTEM "b.xml">
]>
<node>
    amp;b;
</node>
  

Анализатор XML будет динамически включать содержимое b.xml по мере разбора a.xml и создаст нужный вам XML.

Если вы загружаете a.xml в IE, он будет отображаться правильно.

Примечание: Некоторые браузеры имеют очень строгие политики безопасности, которые вызывают проблемы с загрузкой XML-файлов, на которые даны ссылки, из файловой системы и расширением ссылок на объекты, поэтому это может работать не во всех браузерах, если вы загружаете a.xml из файловой системы, но может работать в большем количестве браузеров, если вы загружаете с URL.

Ответ №2:

Когда этот XML-документ открывается в браузере:

 <?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?>
<node>
 -Include Contents of b.xml
</node>
  

С помощью этой таблицы стилей XSLT (другого XML-документа), ссылающегося на stylesheet.xsl относительный URI:

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="node">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:copy-of select="document('B.xml')"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
  

Он отображается (без какого-либо стиля или с таблицей стилей XML по умолчанию в браузере) в виде:

 <node>
    <anode>a</anode>
</node>
  

Примечание: Инструкция по обработке. Я использовал xsl:copy-of инструкцию, потому что не хотел сбивать вас с толку возможной бесконечной рекурсией…