如何在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> - 然后在外部模块里,用这个参数加载主样式表:
要是用的是XSLT 3.0,还可以直接用<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>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
相关产品推荐
相关产品推荐

