5

我有这个 XML 文件:

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

我希望它在http://www.w3schools.com/dom/books.xml处理时会导致引用的远程 XML 文件。

为此,我创建了这个 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?

4

2 回答 2

8

在评论中,OP 要求在Copy xml document's images in different source locations into single output directory 中对我引用的答案进行演练,所以就在这里。

这个模板..

<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:include 元素:

  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>

...对纯文本包含做类似的事情。注意@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 节点为我们提供了一些备用内容。

于 2012-07-18T02:08:11.820 回答
0

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

于 2012-07-17T16:33:55.267 回答