如果每一个变量声明(其必须在单个样式表模块中是这样,则可以简单地使用这个XPath 2.0表达式:
doc(yourUri)//xsl:variable/@name/string()
其中命名空间前缀"xsl"
必须注册到该命名空间。"http://www.w3.org/1999/XSL/Transform"
或从XSLT样式表:
document(yourUri)//xsl:variable/@name/string()
你可能想也获得所有参数名:
doc(yourUri)//xsl:param/@name/string()
或者,变量和参数名称:
doc(yourUri)//*[self::xsl:variable or self::xsl:param]/@name/string()
现在,这不会让你设定在XPath表达式中定义的变量。要做到这一点,你需要一个XPath 2.0解析器(和词法分析器)。在过去,我开发了这样的(使用FXSL parsing framework)但尚未发布此解析器。如果你有兴趣,请告诉我,我会把它发给你。
或者,对于XSLT属性名称的预定义子集,您可以分析它们的值并检索可能跟有空格的美元,然后是名称。所有这些都不能在单引号或双引号内。这样的正则表达式不太难写。
作为最后一步,你必须去重复这样得到的变量引用 - 使用xsl:for-each-group
更新例如:
这里的一个片段XPath 2。0语法我使用:
VariableReference : '$' QName
QName : QNAME2
| OR
| AND
| EQ
| NE
| LT
| LE
| GT
| GE
| IS
| TO
| DIV
| IDIV
| MOD
| UNION
| INTERSECT
| EXCEPT
| THEN
| ELSE
| IN
| RETURN
| SATISFIES
而QNAME2在词法分析器中定义这样终止符号:
([\i-[:]][\c-[:]]*:)?[\i-[:]][\c-[:]]*
当然,即使在此之前我们必须确保(认),这不是字符串文字的一部分,在我的词法分析器中,我将其定义为:
("([^"])*")+
|
('([^'])*')+
另外,您应该跳过评论中的所有内容。我有这样的正则表达式的评论开始和评论结束:
(\(:) <!-- Comment start -->
|
(:\)) <!-- Comment end -->
看来我们没有saxonica,只有这个撒克逊免费的开源部分。我无法访问您在此处编写的API?有其他方法吗? – Vajda
我希望xpath.compile()使用xpath解析器,并问我每个特定的变量,但事实并非如此。 :/ – Vajda
描述的接口可在Saxon-HE 9.4中找到。 –