簡體   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