1

Java と saxon プロセッサを使用しています。

可能な変数参照を含む XPath 式があるとします。また、パラメーターとして可変参照を持つことができる任意の深さにネストできるカスタム xpath 関数もいくつかあります。したがって、xpath 式はかなり複雑です。

xpath 式のすべての変数 ref を評価せずにプレフィックスとローカル名を抽出したいと思います。

カスタム XPathVariableResolver を xpath に設定し、それを評価することで抽出できます。しかし、時間がかかる可能性のあるカスタム関数を呼び出すのではなく、変数参照のみを抽出する必要があるため、これはかなりのオーバーヘッドになる可能性があります。

「$」記号を使用したパターンマッチングだけで安全ですか? おそらく、これに対するいくつかの API 呼び出しは素晴らしいでしょう。または、API 呼び出しが利用できない場合、'$' 記号を使用して回避する必要があるケース (おそらく文字列として配置される可能性があり、それを使用しないようにする必要があります)。

4

2 に答える 2

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 解析フレームワークを使用して) そのようなものを開発しましたが、このパーサーは公開していません。興味がありましたら、お知らせください。お送りします。

または、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 --> 
于 2012-11-25T14:36:52.653 に答える
1

s9api XPathCompiler クラスを使用して式をコンパイルします。

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

式の外部変数は、次を呼び出すことで使用できます。

exp.iterateExternalVariables();

ところで、サクソンの疑問がここで注目されるかどうかは、一長一短です。確実な回答が必要な場合は、 http://saxonica.plan.io/の Saxon フォーラムを使用してください。

于 2012-11-25T17:15:57.150 に答える