首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当从另一个文件运行xsl时,如何获得所需的基URI?

当从另一个文件运行xsl时,如何获得所需的基URI?
EN

Stack Overflow用户
提问于 2013-08-21 05:16:57
回答 1查看 1.9K关注 0票数 5

当我的测试用XSpec运行时,有一个突出的问题:全局变量的基本URI被设置为运行我的XSLT的xspec父程序,而不是XML输入本身。

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

但是,当它通过XSpec运行时,基本URI被设置为XSpec本身--大概是因为XSpec将base URI定义为:

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

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

一旦我将变量移动到模板中,并且它们变成了本地变量,它们的基URI就很好了。但这将克服为我使用变量的全部问题,而不是重复select调用。

关于如何解决这个问题有什么建议吗?

我在SAXON 9.4.0.6 (& HE版本)中使用XSLT2.0。

更新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数据的是转换本身--不幸的是,在我的xsl的全局级别中,基uri是错误的,不是设置为导入的文档,而是设置为xspec样式表。

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

更新2

给出一些来自Michael的更多反馈(谢谢!),我已经附上了我正在工作的minimal test case。您还需要下载XSpec 0.4-rc1,但这是不必要的。

获得XSpec后,如果您在Windows上,则需要编辑xspec-0.4.0rc1/bin/xspec.bat,以指向第3行的Saxon。

否则,要运行它,您可以执行xspec.bat .\DCM2EA.xspec

理想情况下,输出中全局的基本URI将指向NEHTA-00009-Adverse_Reaction-Structure (sample data).xml。现在,它没有-它指的是.xspec。这是直接影响-s:%XSPEC%在xspec.bat在第73行。

xspec的工作方式是创建一个给定DCM2EA.xspec的中间转换,并在xspec/DCM2EA.xsl中运行它自己的测试(这就是为什么XSpec在本例中是可选的,您可以直接运行xspec - bad属性name/xspec/DCM2EA.xsl )。

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

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

我本希望xml:base能在这里有所帮助,但我还没有让它发挥作用,也没有解决方案。

谢谢你找我!

EN

回答 1

Stack Overflow用户

发布于 2013-08-29 23:29:33

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

代码语言:javascript
复制
<xsl:variable name="x" as="element()">
  <stuff>
    <more/>
  </stuff>
</xsl:variable>
....  select="$x" ...

有以下几点:

代码语言:javascript
复制
<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没有提供属性.或者像我写的那样听起来不太对。

我希望这能帮到你。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18349331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档