如何基于用户主目录动态生成Schematron see属性?Oxygen XML适配问题
动态生成Schematron see属性(Oxygen XML环境)
可行性说明
完全可行,既不是Schematron的技术限制,也不是Oxygen XML的bug,问题源于写法不符合Schematron的语法规范。
问题分析
你当前的测试代码尝试在sch:report的文本内容中用sch:value-of输出变量,但如果核心需求是给see属性赋值动态链接,直接引用变量或文本输出的写法都有需要调整的地方:
- 若要给
see属性设置动态值,不能直接写see="$x"——Schematron属性值默认是静态字符串,需用属性值模板(AVT)(即{变量名}格式)解析变量,而你已设置queryBinding="xslt2",满足AVT的使用条件。 - 若只是想在报告文本中显示变量值,你的写法本身是正确的,若Oxygen未解析,需确认验证配置是否启用了XSLT 2.0支持。
修正方案
1. 动态生成see属性值
使用AVT语法将变量注入see属性,示例代码:
<?xml version="1.0" encoding="UTF-8"?> <sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2" xmlns:sqf="http://www.schematron-quickfix.com/validator/process"> <sch:pattern> <sch:rule context="/"> <sch:let name="x" value="if (contains(base-uri(), 'myname')) then 'http://www.a.com' else 'http://www.b.com'"/> <!-- 用AVT语法解析变量到see属性 --> <sch:report test="'a' = 'a'" see="{$x}"> Hello world: <sch:value-of select="$x"/> </sch:report> </sch:rule> </sch:pattern> </sch:schema>
2. 基于用户主目录生成本地链接
针对“用户专属本地风格指南链接”的需求,可通过XSLT的system-property('user.home')函数获取用户主目录,拼接成file://协议的本地链接:
<?xml version="1.0" encoding="UTF-8"?> <sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2" xmlns:sqf="http://www.schematron-quickfix.com/validator/process"> <sch:pattern> <sch:rule context="/"> <sch:let name="userHome" value="system-property('user.home')"/> <!-- 拼接本地风格指南路径,按需调整后续路径 --> <sch:let name="styleGuideUrl" value="concat('file:///', replace($userHome, '\\', '/'), '/docs/style-guide.html')"/> <sch:report test="'a' = 'a'" see="{$styleGuideUrl}"> 查看用户专属风格指南:<sch:value-of select="$styleGuideUrl"/> </sch:report> </sch:rule> </sch:pattern> </sch:schema>
关键注意事项
- 确认Oxygen XML的Schematron验证配置:确保查询绑定为
xslt2,且使用的XSLT处理器(Oxygen默认的Saxon)支持2.0版本。 - 本地路径处理:Windows系统的反斜杠需替换为正斜杠,
file://协议需遵循file:///盘符:/路径/文件的格式。
内容的提问来源于stack exchange,提问作者Stefan Jung
相关产品推荐
相关产品推荐

