すべての変数が宣言されている場合 (単一のスタイルシート モジュールで宣言する必要がある場合は、次の 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 -->