XPath インスペクション
XPath 言語の実装は、対話モードでも XSLT スクリプトを書くときにも、XPath 式を書くときによくあるコーディングミスをチェックできる、いくつかの組み込みインスペクションを提供します。 これらのインスペクションには、 設定ダイアログの Inspectionsページで設定できるさまざまな構成オプションも用意されています。
始める前に
JetBrains マーケットプレイスからプラグインをインストールする説明に従って、 設定 | プラグイン ページの マーケットプレース タブに XPathView + XSLT プラグインをインストールして有効にします。
XPath 型チェック
XPath 式では、 暗黙の型変換 と 冗長な型変換 の型変換を扱うインスペクションが 2 つあります。
暗黙の型変換
このインスペクションは、定義済みの XPath 型 STRING、NUMBER、BOOLEAN および NODESET 間の暗黙的な変換をチェックします。 これは通常、コンバージョンが標準によって明確に定義されているため、これは問題ではありませんが、このインスペクションは型についてより表現力があり、微妙なバグを避けるために役立つ XSLT スクリプトを書くのに役立ちます。
<xsl:if test="foo" /> は <xsl:if test="string(foo)" /> と同じではありません
最初のテストでは、要素 foo が存在するかどうかを確認します(count(foo) > 0) 、ただし後者のテストは、要素に実際にテキスト string-length(foo) > 0 が含まれている場合にのみ当てはまります。 プラグインは、型変換をより明示的にすることを提案します。
インスペクションを個人の好みに合わせるには、いくつかのタイプがあります。
プラグインには、 <xsl:if test="number(foo)" /> などの実際に予想される型にならない明示的な変換を常にフラグするように指示することもでき、 string() 関数を string-length() > 0 の作成のショートカットとして使用することで、NODESET から BOOLEAN への変換を無視する特別なオプションを提供します。
冗長な型変換
このインスペクションは、関数 string()、 number() または boolean() による型変換が冗長であるかどうか、つまり、引数の型が関数の戻り値の型と同じであるかどうか、式の予期される型が any 型であるかどうかをチェックします。 このような明示的な変換は、型を強調するために意図的に行われる場合がありますが、通常は安全に削除できます。
式の妥当性チェック
これらのインスペクションは、インスタンスドキュメント内で発生しない要素 / 属性名の参照や、何も一致しない可能性のある述語の使用など、式に潜在的な意味上の間違いが含まれていないかどうかをチェックします。
ノードテストのチェック
このインスペクションは、XPath 式で使用されている要素 / 属性名が実際に関連付けられた XML ファイルの一部であるか、参照スキーマで定義されているかどうかをチェックします。 これは、スクリプトの実行時に発生する XPath 式の型ミスによる問題を回避するのに役立ち、すぐには認識されなくなる可能性があります。
例:
<xsl:template match="<emphasis>h:txtarea</emphasis>"/>
接頭辞 h はXHTML 名前空間、インスペクションの意志フラグ要素の正しい名前が テキストエリアであるため、未知の要素名と一致式のこの部分にバインドされている場合。
インデックスゼロの使用
このインスペクションは、述語インデックスまたは関数 position() との比較でゼロが誤って使用されていないかどうかをチェックします。 XPath では、インデックスはゼロで はなく1 から始まるため、これはほとんどの場合バグです。
例:
//someelement[position() = 0] または //something[0]
カスタム XPath インスペクションの開発
XPath インスペクションは、GoLand の通常のインスペクション API を利用します。 ただし、XPath 言語サポートの統合方法により、これは少し複雑になります。 現時点では、本格的なサードパーティ XPath インスペクションを開発することはできません。 XPath-PSI API を利用し、 org.intellij.lang.xpath.validation.inspections.XPathInspection から派生したカスタムインスペクションを開発することは理論的には可能ですが、これは推奨されず、サポートされていません。