在 XSLT 样式表中使用额外的 XML 树——但 document() 函数不可用

问题描述 投票:0回答:2

我的 XSLT 样式表需要加载外部 XML 资源以便在转换期间使用。外部 XML 本质上是转换过程中需要的查找表。

这在正常的 xsltproc 上下文中工作正常。我使用 xslt document() 函数从 URI 加载 XML:

<xsl:variable name="scProject" select="document('http://somepath/vx_all.xml')" />

一旦 XML 可用,我就可以像这样进行查找:

<xsl:attribute name="src">
    <xsl:for-each select="$scProject/shfb:Project/shfb:ItemGroup/shfb:Image">
        <xsl:if test="$myID=./shfb:ImageId" >
            <xsl:value-of select="substring-after(@Include,'Media\')" />
        </xsl:if>
    </xsl:for-each>
</xsl:attribute>

不幸的是,我需要在无法从 URI 加载外部 XML 的上下文中执行此 XSL 转换。相反,我需要创建一个包含 XML 并且可以以相同方式使用的

<xsl:variable>
(例如,XSLT 将视为 node 而不是文本。)

tl;博士

特定上下文是 Webview VS Code 扩展。 XSL 样式表是为与 Saxon.js 实现一起使用而预编译的,并且

document()
的参数在样式表编译时解析,而不是在 Webview 运行时解析。我的计划是在我的扩展的 TypeScript 代码中读取外部 XML 资源的内容并将其作为参数传递给 XSLT,但我无法弄清楚如何让 XSLT 将此外部参数值视为节点而不是 xs :文字。

xml xslt document saxon saxon-js
2个回答
0
投票

解析-xml()

好尴尬……


0
投票

当你说:并且 document() 的参数在样式表编译时解析,而不是在 Webview 运行时,我不完全确定你所说的 resolved 是什么意思。

我怀疑你的意思是传递给 document() 函数的相对 URI 是根据源样式表的编译时位置解析的,而不是编译样式表(SEF 文件)的运行时位置。有一个选项

-relocate:on
来改变这个。

© www.soinside.com 2019 - 2024. All rights reserved.