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