我有这样的XML文件:
<?xml version="1.0"?>
<xi:include href="http://www.w3schools.com/dom/books.xml"
xmlns:xi="http://www.w3.org/2003/XInclude"/>
我预计应该导致引用的远程XML文件http://www.w3schools.com/dom/books.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
未执行指令。
所以,我怎么可以申请XSLT上Xincluded XML文件,如果可能的话?
在评论中,OP已经要求我的参考答案的步行通过在不同的源位置到单一的输出目录复制XML文档的图像 ,所以在这儿呢。
此模板..
<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>
...匹配十一:包括满足所有这些要求的要素:
- 有一个href属性
- 它指的是一个XML文档(而不是文本文档)
- 而该文件可以发现,是打开。
当这些条件都满足时,打开XML文档和处理它,就像它是发生在这里,而不是十一:包括节点。
此模板...
<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>
......处理这样的情形,我们可以打开该文档(可能是文件引用被破坏),以及十一的情况:包括节点为我们提供了一些后备内容。
XInclude处理,像XSD验证,是东西,如果你要求它出现这种情况,而不是别的。 你问它的方式取决于你所处的环境。例如,Xerces解析器有选择做XInclude处理。