当我的测试使用 XSpec 运行时,有一个明显的问题:全局变量的基本 URI 设置为运行我的 XSLT 的 xspec 父级,而不是 XML 输入本身。
因此,当我的 XSL 转换自己针对 XML 运行时,一切都很好,全局变量正在选择它们应该选择的内容:输入 XML 中的元素。
然而,当它通过 XSpec 运行时,基本 URI 被设置为 XSpec 本身——大概是因为 XSLT 规范将基本 URI定义为:
如果元素或处理指令出现在外部实体中,则该元素或处理指令的基本 URI 是外部实体的 URI;否则,基本 URI 是文档的基本 URI。
这对我来说是个问题。我已经尝试xml:base
在变量和xsl:stylesheet
: 上使用该属性,但这似乎并没有影响基本 URI;它只受影响fn:static-base-uri()
。此外,static-base-uri()
始终返回我想要的正确 URI - 所以我希望该值以某种方式成为我的全局变量的基本 URI。
一旦我将变量移动到模板中并且它们成为本地变量,它们的基本 URI 就可以了。但这会破坏我使用变量的全部意义,这不是重复选择调用。
关于如何解决这个问题的任何提示?
我将 XSLT 2.0 与 SAXON EE 9.4.0.6(和 HE 版)一起使用。
更新 1
我做了更多调查,似乎 XSpec 以这种方式调用 Saxon:
java -cp "%CP%" net.sf.saxon.Transform -o:%RESULT% -s:%XSPEC% -xsl:%TEST_STYLESHEET% -it:{http://www.jenitennison.com/xslt/xspec}main
这意味着源 XML 文件 -s 是 .xspec 样式表本身。如果它必须为转换工作提供一些XML 数据是有道理的,但在这种情况下,是转换本身通过导入它使用的 XML 数据fn:doc()
- 不幸的是,在我的 xsl 的全局级别内,基本 uri 是错误的而不是设置为导入的文档,但设置为 xspec 样式表。
因此,作为测试,我将 Saxon -s 标志设置为 XML 输入文档和 tada - 基本 URI 现在是正确的。但这意味着我不能在 xspec 中使用任何其他 xml,因此不是一个非常可行的解决方案。
更新 2
鉴于 Michael Kay 的更多反馈(谢谢!),我附上了我正在使用的最小测试用例。您还需要下载XSpec 0.4-rc1,但这不是必需的。
获得 XSpec 后,如果您使用的是 Windows,则需要编辑 xspec-0.4.0rc1/bin/xspec.bat 以指向第 3 行的 Saxon jar。
否则,要运行它,您需要执行xspec.bat .\DCM2EA.xspec
.
理想情况下,输出中全局的基本 URI 将指向NEHTA-00009-Adverse_Reaction-Structure (sample data).xml
. 现在,它没有 - 它指向 .xspec。这直接受到-s:%XSPEC%
第 73 行的 xspec.bat 的影响。
xspec 的工作方式是它在给定 DCM2EA.xspec 和它自己在 xspec/DCM2EA.xsl 中的测试的情况下创建一个中间转换并运行该转换(这就是为什么在这种情况下 XSpec 是可选的,您可以运行 xspec - bad attribute name/xspec/ DCM2EA.xsl 直接)。
我遇到的问题是base-uri()
在原始 DCM2EA.xsl 的全局上下文中设置为 xspec 文件,这是错误的。模板内部base-uri()
设置得很好(正如您Base URI now
在输出中看到的那样),但是将变量移动到本地范围是不切实际的。
指定输入 xml 数据也不可行,因为我的实际 .xspec 导入了几个不同的文件,而且我不想分解已有的 190 个测试并添加这样的变通方法。
我希望这xml:base
会有所帮助,但我还没有让它工作并且没有解决方案。
感谢您的关注!