繁体   English   中英

从java中的xpath表达式中提取所有变量引用的最安全方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM