You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在oXygen环境下的XSLT中引用主样式表<xd:doc>版本信息?

这个问题我之前处理过好几次,其实不用折腾fn:doc()加动态文件名,XSLT本身就有办法直接引用当前运行的主样式表,给你几个实用的方案:

1. 用document('')直接加载主样式表

在XSLT 2.0及以上版本中,当你调用document('')(空字符串作为参数)时,它会自动加载当前正在执行的主样式表作为XML节点树,这样你就能用XPath直接遍历样式表内部的<xd:doc>节点了。

不过要注意:必须在你的样式表头部声明xd命名空间,否则XPath找不到对应的节点。比如:

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl">
    <!-- 你的样式表内容 -->
</xsl:stylesheet>

2. 编写XPath定位版本信息

有了主样式表的节点树,就可以精准定位到你要的版本信息了。比如:

  • 要获取最新的版本号(也就是最后一条更新记录):

    document('')//xd:doc[@scope='stylesheet']//xd:li[xd:i='Updates']/xd:ul/xd:li[last()]/xd:i/text()
    

    这个表达式会找到<xd:doc>下的Updates列表,然后取最后一个<xd:li>里的版本号。

  • 如果要获取所有版本记录,可以用:

    document('')//xd:doc[@scope='stylesheet']//xd:li[contains(., 'version:')]/xd:i/text()
    

    它会把所有带version:的条目里的版本号都提取出来。

3. 外部模块的解决方案

如果你的版本读取逻辑放在外部XSL模块里,直接用document('')会加载模块本身,这时候可以这么做:

  • 在主样式表里调用外部模块的模板时,传递主样式表的URI作为参数:
    <xsl:call-template name="get-version">
        <xsl:with-param name="main-uri" select="base-uri(document(''))"/>
    </xsl:call-template>
    
  • 然后在外部模块里,用这个参数加载主样式表:
    <xsl:template name="get-version">
        <xsl:param name="main-uri"/>
        <xsl:value-of select="document($main-uri)//xd:doc[@scope='stylesheet']//xd:li[last()]/xd:i/text()"/>
    </xsl:template>
    
    要是用的是XSLT 3.0,还可以直接用static-base-uri()函数获取主样式表的编译时URI,更省心。

4. oXygen 20.1中的验证

你用的oXygen 20.1默认支持Saxon处理器(XSLT 2.0/3.0),这些方法都能正常运行。你可以在oXygen的XPath表达式工具里直接测试document(''),看看能不能正确加载到主样式表的节点,调试起来很方便。

内容的提问来源于stack exchange,提问作者oleksii.sapov-erlinger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:37:08