Vad*_*kin 5 xslt xslt-2.0 xspec
当我使用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就可以了.但是,这将打败我使用变量的整个过程,而这并不是重复选择调用.
关于如何解决这个问题的任何提示?
我正在使用带有SAXON EE 9.4.0.6(&HE版)的XSLT 2.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数据fn:doc()- 不幸的是在我的xsl的全局级别中,基础uri是错误的而不是设置为导入的文档,但设置为xspec样式表.
因此,作为测试,我将Saxon -s标志设置为XML输入文档和tada - 基本URI现在是正确的.但这意味着我不能在xspec中使用任何其他xml,因此不是一个非常可行的解决方案.
更新2
鉴于迈克尔凯的更多反馈(谢谢!),我附上了我正在使用的最小测试用例.您还需要下载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的工作方式是它在x2pec/DCM2EA.xsl中给出DCM2EA.xspec及其自己的测试创建中间转换并运行该转换(这就是为什么XSpec在这种情况下是可选的,你可以运行xspec - 坏属性名称/ xspec/DCM2EA.xsl直接).
我遇到的问题是base-uri()在原始DCM2EA.xsl的全局上下文中设置为xspec文件,这是错误的.该base-uri()内部模板设置罚款(如你看到Base URI now的输出),但它是不切实际的变量移动到本地范围.
指定输入xml数据是不可行的,因为我的实际.xspec导入了几个不同的文件,我不想打破我得到的190个测试并添加这样的解决方法.
我希望这xml:base会有所帮助,但我没有让它工作,我没有解决方案.
谢谢你的期待!
由于我的限制,我无法检查您的代码或运行测试,但您的情况让我想起了我替换以下内容的情况:
<xsl:variable name="x" as="element()">
<stuff>
<more/>
</stuff>
</xsl:variable>
.... select="$x" ...
Run Code Online (Sandbox Code Playgroud)
具有以下内容:
<xsl:variable name="x" as="element()">
<wrapper xml:base="something">
<stuff>
<more/>
</stuff>
</wrapper>
</xsl:variable>
.... select="$x/*" ...
Run Code Online (Sandbox Code Playgroud)
这种方式<stuff>具有基本 URI,但没有 xml:base= 属性,但我<stuff>在这两种情况下都进行选择。我认为我的问题是我需要设置基本 URI,但验证文档的 DTD 没有提供属性...或类似的内容,因为这听起来不太正确,因为我写的。
我希望这有帮助。