5

当我的测试使用 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会有所帮助,但我还没有让它工作并且没有解决方案。

感谢您的关注!

4

1 回答 1

1

由于我的限制,我无法检查您的代码或运行测试,但您的情况让我想起了我替换以下内容的情况:

<xsl:variable name="x" as="element()">
  <stuff>
    <more/>
  </stuff>
</xsl:variable>
....  select="$x" ...

具有以下内容:

<xsl:variable name="x" as="element()">
  <wrapper xml:base="something">
    <stuff>
      <more/>
    </stuff>
  </wrapper>
</xsl:variable>
.... select="$x/*" ...

这种方式<stuff>具有基本 URI,但没有 xml:base= 属性,但我<stuff>在这两种情况下都进行了选择。我认为我的问题是我需要设置基本 URI,但验证文档的 DTD 没有提供属性......或者类似的东西,因为这听起来不太正确,因为我已经写了它。

我希望这有帮助。

于 2013-08-29T23:29:33.530 回答