Скажем, у меня есть документ источника XML, который использует XIncludes, как это:Могу ли я вставить экземпляр xi: fallback по умолчанию перед обработкой XInclude?
<?xml version="1.0" encoding="UTF-8"?>
<parent xmlns:xi="http://www.w3.org/2001/XInclude" xml:id="parent01">
<xi:include href="child01.xml"/>
<xi:include href="child02.xml"/>
<xi:include href="child03.xml"/>
</parent>
Три дополнительных документов XML вызываемыми в XIncludes выглядеть следующим образом:
child01.xml:
<?xml version="1.0" encoding="UTF-8"?>
<children>
<child xml:id="child01">
<p>This is child 1.</p>
</child>
</children>
child02.xml:
<?xml version="1.0" encoding="UTF-8"?>
<children>
<child xml:id="child02">
<p>This is child 2.</p>
</child>
</children>
child03.xml:
<?xml version="1.0" encoding="UTF-8"?>
<children>
<child xml:id="child03">
<p>This is child 3.</p>
</child>
</children>
У меня есть XSLT 2.0 преобразовать так:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:apply-templates select="parent"/>
</xsl:template>
<xsl:template match="parent">
<volume>
<xsl:apply-templates select="@*|.//child"/>
</volume>
</xsl:template>
<xsl:template match="child">
<chapter>
<xsl:apply-templates select="@*|*|text()"/>
</chapter>
</xsl:template>
<xsl:template match="@*|*|text()">
<xsl:copy copy-namespaces="no">
<xsl:apply-templates select="@*|*|text()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Когда все файлы, на которые ссылается XIncludes присутствуют в той же папке, parent01.xml, мой преобразование работает просто отлично, и производит это выход:
<?xml version="1.0" encoding="UTF-8"?>
<volume xml:id="parent01">
<chapter xml:id="child01">
<p>This is child 1.</p>
</chapter>
<chapter xml:id="child02">
<p>This is child 2.</p>
</chapter>
<chapter xml:id="child03">
<p>This is child 3.</p>
</chapter>
</volume>
Однако, если один файл - скажем, child02.xml - отсутствует, преобразование завершается с ошибкой.
Эта неудача была бы предотвратить, если бы parent01.xml были включены XI: элементы замещающего, как это:
<?xml version="1.0" encoding="UTF-8"?>
<parent xmlns:xi="http://www.w3.org/2001/XInclude" xml:id="parent01">
<xi:include href="child01.xml">
<xi:fallback>
<child>
<p>The file is missing.</p>
</child>
</xi:fallback>
</xi:include>
<xi:include href="child02.xml">
<xi:fallback>
<child>
<p>The file is missing.</p>
</child>
</xi:fallback>
</xi:include>
<xi:include href="child03.xml">
<xi:fallback>
<child>
<p>The file is missing.</p>
</child>
</xi:fallback>
</xi:include>
</parent>
Затем выходной сигнал был бы следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<volume xml:id="parent01">
<chapter xml:id="child01">
<p>This is child 1.</p>
</chapter>
<chapter>
<p>The file is missing.</p>
</chapter>
<chapter xml:id="child03">
<p>This is child 3.</p>
</chapter>
</volume>
Мой вопрос это: можно ли написать мой XSLT-преобразование, чтобы вставить экземпляр xi: fallback в каждый xi: включить до, обрабатывая XInclude - то есть, чтобы добавить стандартный xi: резервный экземпляр, где ни один не присутствует, а затем pro вывести XInclude так, как если бы этот xi: резервный экземпляр присутствовал?
Благодарим за любые советы, которые может предложить любой.
Что XSLT процессор и XML разбора вы используете для XInclude и преобразование результат? Но в любом случае, я думаю, что ответ будет следующим: Xinclusions сделаны _before_ преобразование XSLT позволяет увидеть документ. XInclude выполняется парсером XML, который находится выше по потоку от обработки XSLT. –