我正在使用 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:"
}
}
您必须将输入流的基本 URI 设置为输入文件目录的代码是罪魁祸首,即您有
transformer.SetInputStream(inputStream, new Uri(Path.GetDirectoryName(inputFile)));
但是需要
transformer.SetInputStream(inputStream, new Uri(inputFile));
如果将基本 URI 设置为父目录,然后使用带有
../../
的相对 URI,则示例数据最终会出现在 file:/D:/
中。