如何从另一个文件运行xsl时获取所需的基本URI?

时间:2013-08-21 05:16:58

标签: xslt xslt-2.0 xspec

当我的测试使用XSpec运行时,会出现一个明显的问题:全局变量的基URI设置为运行我的XSLT的xspec父项,而不是XML输入本身。

因此,当我的XSL转换本身针对XML运行时,一切都很好,全局变量正在选择它们应该是什么:输入XML中的元素。

但是,当它通过XSpec运行时,基本URI设置为XSpec本身 - 可能是因为XSLT规范将base URI定义为:

  

如果元素或处理指令出现在外部实体中,则该元素或处理指令的基URI是外部实体的URI;否则,基URI是文档的基URI。

这对我来说是个问题。我尝试在变量和xml:base上使用xsl:stylesheet属性:但这似乎不会影响基URI;它只影响fn:static-base-uri()。此外,static-base-uri()总是返回我想要的正确的URI - 所以我希望该值以某种方式成为我的全局变量的基本URI。

一旦我将变量移动到模板中并且它们变为本地变量,它们的基本URI就可以了。但是,这将打败我使用变量的整个过程,而不是重复选择调用。

有关如何解决此问题的任何提示?

我正在使用带有SAXON EE 9.4.0.6(& HE版)的XSLT 2.0。


更新1

我已经做了更多的调查,似乎XSpec以这种方式称撒克逊:

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数据1}} - 不幸的是,在我的xsl的全局级别中,基础uri是错误的,并没有设置为导入的文档,而是设置为xspec样式表。

因此,作为测试,我将Saxon -s标志设置为XML输入文档和tada - 基本URI现在是正确的。但这意味着我不能在xspec中使用任何其他xml,因此不是一个非常可行的解决方案。


更新2

鉴于迈克尔凯的更多反馈(谢谢!),我附上了我正在使用的minimal test case。您还需要下载XSpec 0.4-rc1,但这不是必需的。

一旦你有了XSpec,如果你在Windows上,需要编辑xspec-0.4.0rc1 / bin / xspec.bat以指向第3行的Saxon jar。

否则,要运行它,请执行fn:doc()

输出中global的基URI将理想地指向xspec.bat .\DCM2EA.xspec。现在,它没有 - 它指向.xspec。这直接受到第73行xspec.bat中NEHTA-00009-Adverse_Reaction-Structure (sample data).xml的影响。

xspec的工作方式是它在DCM2EA.xspec和xspec / DCM2EA.xsl中自己的测试创建一个中间转换并运行该转换(这就是为什么XSpec在这种情况下是可选的,你可以运行xspec - 坏属性名称/xspec/DCM2EA.xsl直接)。

我遇到的问题是原始DCM2EA.xsl中全局上下文中的-s:%XSPEC%被设置为xspec文件,这是错误的。模板中的base-uri()设置得很好(正如您在输出中看到的那样base-uri()),但将变量移动到局部范围是不切实际的。

指定输入xml数据是不可行的,因为我的实际.xspec导入了几个不同的文件,我不想打破我已经获得的190个测试并添加这样的解决方法。

我希望Base URI now能在这里提供帮助,但我没有让它工作,而且没有解决方案。

感谢您的期待!

1 个答案:

答案 0 :(得分: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没有提供属性......或者沿着那些行提供的东西,因为这听起来不是很正确,因为我写了它。 / p>

我希望这会有所帮助。