#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
инструкцию, потому что не хотел сбивать вас с толку возможной бесконечной рекурсией…