3

我即将合并其相对路径在我的输入 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>

对于每个文件,我都会收到一个错误:

系统找不到指定的文件。

它指出已返回一个空节点集(因此无法加载文件)。有人知道如何解决这个问题吗?

干杯

4

2 回答 2

2

检查源文档的基本 URI 是否已知,例如通过执行 base-uri(/)。在参数作为节点(或节点集)提供的情况下,此值用于解析传递给 document() 的相对 URI。

基本 URI 未知的两种常见情况是:

(a) 如果您将源文档作为内存中的 DOM 提供

(b) 如果您将源文档作为输入流或没有已知 URI 的 Reader 提供。

于 2013-08-27T21:21:59.993 回答
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>
于 2013-08-27T15:32:04.783 回答