如何使用XInclude在XML上应用XSLT



我有这个XML文件:

<?xml version="1.0"?>
<xi:include href="http://www.w3schools.com/dom/books.xml" 
            xmlns:xi="http://www.w3.org/2003/XInclude"/>

并且我期望它在处理时会导致引用的远程XML文件CCD_ 1。

为此,我创建了这个XSL文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="xml"/>
    <xsl:template match="*">
        <xsl:copy-of select="//book/title"/>
    </xsl:template>
</xsl:stylesheet>

在XSL转换之后,我希望从引用的XML文件中获得带有标题节点的XML输出。

然而,它并没有发生,转换只是生成了一个空文件。我怀疑XInclude指令没有执行。

那么,如果可能的话,我如何在Xincluded XML文件上应用XSLT呢?

在评论中,OP要求在Copy xml文档';s图像在不同的源位置到单一的输出目录,所以它在这里。

此模板

<xsl:template match="xi:include[@href][@parse='xml' or not(@parse)][fn:unparsed-text-available(@href)]">
 <xsl:apply-templates select="fn:document(@href)" />
</xsl:template>

匹配xi:包含满足所有这些要求的元素:

  1. 具有href属性
  2. 它指的是xml文档(与文本文档相反)
  3. 并且该文档可以被找到并且是可打开的

当满足这些条件时,打开XML文档并处理它,就像它在这里一样,而不是xi:include节点。

此模板

<xsl:template match="xi:include[@href][@parse='text'][fn:unparsed-text-available(@href)]">
 <xsl:apply-templates select="fn:unparsed-text(@href,@encoding)" />
</xsl:template>

对纯文本includes执行类似的操作。注意@parse的默认值是"xml"。注意,我们甚至可以更改字符编码。我们的主要文档可以是UTF-8,但所包含的文档很可能是UTF-16LE。

最后这个模板

<xsl:template match="xi:include[@href][@parse=('text','xml') or not(@parse)][not(fn:unparsed-text-available(@href))][xi:fallback]">
 <xsl:apply-templates select="xi:fallback/text()" />
</xsl:template>

处理可以打开文档的情况(可能文件引用被破坏),xi:include节点为我们提供一些回退内容。

XInclude处理,就像XSD验证一样,是在您请求时发生的事情,而不是在其他情况下。你要求它的方式取决于你所处的环境。例如,Xerces解析器有进行XInclude处理的选项。

最新更新