2012-11-25 13 views
1

我使用java和撒克逊处理器。最安全的方式提取xpath表达式所有可变参在Java

让说,我有与它可能可变裁判的一些XPath表达式。我也有一些可以嵌套到任意深度的自定义xpath函数,这些深度可以具有可变参数作为参数。所以xpath表达式非常复杂。

我想提取在XPath表达式的每个变量REF前缀和localName没有评估它。

我可以通过设置一些自定义XPathVariableResolver我的XPath和通过评估其解压缩。但是,这可能会造成很大的开销,因为我只想要变量引用来提取,而不是调用可能很耗时的自定义函数。

它是安全的只是一些图案,“$”符号匹配办呢? 可能有些API调用会很好。或者如果没有API调用可用,那么我应该避免使用'$'符号(可能它位于字符串,我需要避免采取那种)。

回答

1

使用s9api XPathCompiler类编译表达式:通过调用

XPathCompiler c = new Processor(false).newXPathCompiler(); 
c.setAllowUndeclaredVariables(true); 
XPathExecutable exp = c.compile(xpathExpression); 

表达式中的外部变量可:

exp.iterateExternalVariables(); 

顺便说一下,它是打击和错过是否撒克逊的问题在这里得到注意。如果你想确定一个答案,使用撒克逊论坛http://saxonica.plan.io/

+0

看来我们没有saxonica,只有这个撒克逊免费的开源部分。我无法访问您在此处编写的API?有其他方法吗? – Vajda

+0

我希望xpath.compile()使用xpath解析器,并问我每个特定的变量,但事实并非如此。 :/ – Vajda

+0

描述的接口可在Saxon-HE 9.4中找到。 –

1

如果每一个变量声明(其必须在单个样式表模块中是这样,则可以简单地使用这个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 --> 
+0

我不知道我应该如何使用这些xpath表达式来提取变量,因为我有我的xpath表达式在字符串中。它没有被编译或任何东西。我需要所有带$的变量,没有在xpath中定义的变量,因为“for $ k in ...”这个$ k不应该被收集。 – Vajda

+0

看我的更新 - 这是你需要的一切。 –

+0

@Vajda,你可能也不需要'一些$ x满足...'和'$ x满足......' - 仅举几例。另请参阅我的更新。 –