我即将合并XML文件(并添加元信息),其相对路径在我的输入XML文件中指定。我要合并的文件位于名为“files”的子目录中 输入文件的结构如下
<files>
<file>
<path>files/firstfile.xml</path>
</file>
<file>
<path>files/secondfile.xml</path>
</file>
</files>
firstfile.xml和secondfile.xml具有以下结构
<tables>
<table name = "...">
...
</table>
...
<tables>
我想将一个文件的所有表节点放在一个组中,并向其中添加元信息。所以我编写了以下XSLT样式表:
<xsl:template match="/">
<tables>
<xsl:apply-templates/>
</tables>
</xsl:template>
<xsl:template name = "enrichWithMetaInformation" match = "file">
<xsl:apply-templates select="document(./path)/tables">
<xsl:with-param name="file" select="."/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="tables">
<group>
<meta>
...Some meta data ...
</meta>
<xsl:copy-of select="./table"/>
</group>
</xsl:template>
对于每个文件,我都会收到错误:
系统找不到指定的文件。
它声明已返回空节点集(因此无法加载文件)。有没有人知道如何解决这个问题?
干杯
答案 0 :(得分:2)
检查源文档的基URI是否已知,例如通过执行base-uri(/)。在参数作为节点(或节点集)提供的情况下,此值用于解析传递给document()的相对URI。
基本URI未知的两种常见情况是:
(a)如果您将源文档提供为内存中的DOM
(b)如果您将源文档作为输入流或没有已知URI的Reader提供。
答案 1 :(得分:1)
document()函数的参数应该是一个字符串。获取变量中的路径的节点值与./一起传递并传入。我可以在我到达计算机时进行快速测试,但我认为这是你的问题。这是一个选项:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="/">
<tables>
<xsl:apply-templates/>
</tables>
</xsl:template>
<xsl:template match = "file">
<xsl:variable name="filepath" select="concat('./',path)"/>
<xsl:call-template name="tableprocessor">
<xsl:with-param name="tables" select="document($filepath)/tables"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="tableprocessor">
<xsl:param name="tables"/>
<group>
<xsl:copy-of select="$tables"/>
</group>
</xsl:template>
</xsl:stylesheet>