当我的测试使用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
能在这里提供帮助,但我没有让它工作,而且没有解决方案。
感谢您的期待!
答案 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>
我希望这会有所帮助。