[英]Safest way to extract all variable refs from xpath expression in java
我正在使用 java 和 saxon 处理器。
假设我有一些 XPath 表达式,其中可能包含变量引用。 我还有一些自定义的 xpath 函数,它们可以嵌套到任意深度,可以将变量 refs 作为参数。 所以 xpath 表达式非常复杂。
我想为 xpath 表达式中的每个变量 ref 提取前缀和本地名称而不对其进行评估。
我可以通过将一些自定义 XPathVariableResolver 设置为我的 xpath 并对其进行评估来提取它。 但这会产生相当大的开销,因为我只想提取变量引用,而不是调用可能耗时的自定义函数。
仅通过与 '$' 符号匹配的某种模式是否安全? 可能为此调用一些 API 会很棒。 或者,如果没有可用的 API 调用,那么我应该使用 '$' 符号避免哪些情况(可能它可以作为字符串定位,我需要避免采用那个)。
如果声明了每个变量(必须在单个样式表模块中声明,您可以简单地使用此 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 -->
使用 s9api XPathCompiler 类来编译表达式:
XPathCompiler c = new Processor(false).newXPathCompiler();
c.setAllowUndeclaredVariables(true);
XPathExecutable exp = c.compile(xpathExpression);
表达式中的外部变量随后可通过调用获得:
exp.iterateExternalVariables();
顺便说一句,撒克逊人的问题是否在这里被注意到是命中注定的。 如果您想确定答案,请使用http://saxonica.plan.io/ 上的 Saxon 论坛
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.