プロジェクトの XHTML を分析するために、 Sonar XML プラグインを実装しようとしています。Xpath ルールと複数の名前空間に問題があります。複数の異なる名前空間が含まれているかどうかに関係なく、ファイルに対して Xpath チェックを実行したいのですが、それは不可能のようです。
デフォルトでは、Sonar は名前空間 (この場合は XML または XHTML 名前空間) を自動検出し、関連付けられたスキーマを使用します。問題は、XHTML でPrimefaces タグを使用していて、Sonar のカスタム xpath 検証を使用して、primefaces タグで特定のものをチェックしたいことです。たとえば//p:outputPanel[not(@layout='block')
、XML ファイル内の特定の要素を検索します。
この XPath ルールを Sonar に入れ、チェックを実行します。
mvn -f pom-xhtml.xml sonar:sonar
Primefaces タグが含まれておらず、Primefaces 名前空間が宣言されていないファイルでは、次のエラーが発生します。
[ERROR] [13:35:54.918] Could not analyze the file /Users/...snip.../header.xhtml
org.sonar.api.utils.SonarException: javax.xml.xpath.XPathExpressionException
at org.sonar.plugins.xml.checks.XPathCheck.getXPathExpressionForDocument(XPathCheck.java:120) ~[na:na]
... snip ...
Caused by: javax.xml.xpath.XPathExpressionException: null
at org.apache.xpath.jaxp.XPathImpl.compile(XPathImpl.java:408) ~[xalan-2.7.1.jar:na]
at org.sonar.plugins.xml.checks.XPathCheck.getXPathExpressionForDocument(XPathCheck.java:118) ~[na:na]
... 40 common frames omitted
Caused by: org.apache.xpath.domapi.XPathStylesheetDOM3Exception: Prefix must resolve to a namespace: p
... snip ...
... 41 common frames omitted
このようなファイルの例は、次の 1 行のファイルです。
<?xml version="1.0" encoding="UTF-8"?>
<s:resource xmlns:s="http://jboss.com/products/seam/taglib" xmlns="http://www.w3.org/1999/xhtml" />
私が知る限り、Sonar は "p:" 名前空間を使用して Xpath ルールをテストしようとしているため、その名前空間が宣言されていないファイルではエラーが発生します。他の理由で必要ないため、すべての名前空間をすべてのファイルに追加したくありません。
Sonar が (sonar.xml.schemas オプションを使用して) カスタム スキーマを処理できることがわかったので、必要な名前空間をインポートするスキーマを作成しました。Sonar がこのスキーマを使用して分析する場合、Xpath チェックに必要なすべての名前空間を宣言できます。
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import namespace="http://java.sun.com/jstl/core"/>
<xs:import namespace="http://java.sun.com/jsf/facelets"/>
<xs:import namespace="http://java.sun.com/jsf/html"/>
<xs:import namespace="http://jboss.com/products/seam/taglib"/>
<xs:import namespace="http://java.sun.com/jsf/core"/>
<xs:import namespace="http://primefaces.prime.com.tr/ui"/>
</xs:schema>
ただし、それを試してみると、次のエラーが表示されます。
[ERROR] [12:59:30.197] Could not analyze the file /Users/...snip...header.xhtml
java.lang.NullPointerException: name
at java.util.zip.ZipFile.getEntry(ZipFile.java:156) ~[na:1.6.0_33]
... snip ...
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352) [plexus-classworlds-2.4.jar:na]
これは正確には役に立ちません。空のスキーマを試すと:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
</xs:schema>
次に、最初のエラーに戻ります。したがって、ソナーはカスタム スキーマを正常にポイントしていますが、機能していません。そのため、Sonar (または Java?) は、XML スキーマの一部として他の名前空間をインポートすることを処理できないようです。
これを引き起こす可能性のあるスキーマで何か間違ったことをしていますか? ソナーに関する同様の問題を解決した人はいますか? アドバイスをいただければ幸いです。