假设我有一个使用 XIncludes 的源 XML 文档,如下所示:
<?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>
它在 XIncludes 中调用的另外三个 XML 文档如下所示:
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:fallback 元素,则可以防止此失败,如下所示:
<?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 转换以在处理 XInclude之前将 xi:fallback 的实例插入到每个 xi:include中——也就是说,在不存在的情况下添加默认的 xi:fallback 实例,然后处理XInclude 好像那个 xi:fallback 实例已经存在?
感谢您提供任何建议。