XSLT 错误 FODC0002,尽管路径似乎正确

问题描述 投票:0回答:1

我正在使用 XSLT 2 (Saxon HE 10.9)。

我有以下目录树:

Project
- index.xml
- Classes
  - MyClassA
    - MyClassA.xml 

我正在将

MyClassA.xml
转换为新的文件格式。

这里是示例代码:

<xsl:for-each select="properties/property[type = document('../../index.xml',.)/classes/class/id]">
    <xsl:apply-templates select="display_name"/>
</xsl:for-each>

我收到以下错误:

FODC0002  Exception thrown by URIResolver resolving `../../index.xml` against
`file:///D:/Project/Classes/MyClassA'. Found while atomizing the second operand of '='

我真的不明白为什么会出现此错误,路径似乎是正确的。
路径应该是

file:///D:/Project/Classes/MyClassA/../../index.xml
,和
file:///D:/Project/index.xml
一样,我的文件确实位于这里。

我在这里做错了什么?

编辑: 以下是按照注释中的要求转换文件的 C# 代码:

RawDestination destination = new RawDestination();
using (FileStream inputStream = File.OpenRead(inputFile))
{
    XsltTransformer transformer = executable.Load();
    using (MessageListener msg = new MessageListener(transformer))
    {
        msg.OnError = () => { success = false; };
        transformer.BaseOutputUri = new Uri(outputFile);
        transformer.SetInputStream(inputStream, new Uri(Path.GetDirectoryName(inputFile)));
        transformer.Run(destination); // this will set HasError if an xsl:message contains "error:"
    }
}
xml xslt saxon
1个回答
0
投票

您必须将输入流的基本 URI 设置为输入文件目录的代码是罪魁祸首,即您有

transformer.SetInputStream(inputStream, new Uri(Path.GetDirectoryName(inputFile)));

但是需要

transformer.SetInputStream(inputStream, new Uri(inputFile));

如果将基本 URI 设置为父目录,然后使用带有

../../
的相对 URI,则示例数据最终会出现在
file:/D:/
中。

© www.soinside.com 2019 - 2024. All rights reserved.