如果声明了每个变量(必须在单个样式表模块中声明,您可以简单地使用这个 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 解析框架),但还没有发布这个解析器。如果您有兴趣,请告诉我,我会发送给您。
或者,对于预定义的 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 -->