我的 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()
好尴尬……
当你说:并且 document() 的参数在样式表编译时解析,而不是在 Webview 运行时,我不完全确定你所说的 resolved 是什么意思。
我怀疑你的意思是传递给 document() 函数的相对 URI 是根据源样式表的编译时位置解析的,而不是编译样式表(SEF 文件)的运行时位置。有一个选项
-relocate:on
来改变这个。