2011-07-06 14 views
0

私はJAXプロジェクトでCLiXMLとともにXPATH 1.0パーサを使用していますが、CLiXML制約ルールファイルをセットアップしようとしています。重複したXML要素名を見つける(変数付きのxPath)

特定の子の下に重複する要素名がある場合は、エラーを表示したいと思います。例えば

<parentNode version="1"> 
    <childA version="1"> 
     <ignoredChild/> 
    </childA> 
    <childB version="1"> 
     <ignoredChild/> 
    </childB> 
    <childC version="4"> 
     <ignoredChild/> 
    </childC> 
    <childA version="2"> 
     <ignoredChild/> 
    </childA> 
    <childD version="6"> 
     <ignoredChild/> 
    </childD> 
</parentNode> 

childAが複数回表示されますので、私はこのことについて、エラーが表示されるでしょう。

注:要素の内部属性または子要素ではなく、要素名を「チェック/カウント」したいだけです。

私.clxルール内のコードがあり、私が試したことファイル:

<forall var="elem1" in=".//parentNode/*"> 
    <equal op1="count(.//parentNode/$elem1)" op2="1"/> 
</forall> 

しかし、それは動作しません、私はエラーを取得する:

Caused by: class org.jaxen.saxpath.XPathSyntaxException: count(.//PLC-Mapping/*/$classCount: 23: Expected one of '.', '..', '@', '*', <QName> 

私はコードをしたいと各子名をチェックし、子名の名前で別のxPathクエリを実行します。カウントが1を超える場合、エラーが発生します。

アイデア?

答えて

1

だけで、適切なパス式でサブノードのリストを取得し、そのリスト内の重複をチェックしてみてください:

XPathExpression xPathExpression = xPath.compile("//parentNode/*"); 
    NodeList children = (NodeList) xPathExpression.evaluate(config, XPathConstants.NODESET); 

    for (int i = 0; i < children.getLength(); i++) { 
    // maintain hashset of clients here and check if element is already there 
    } 
+0

私は自分の質問を更新しましたが、わかりませんでした。 Javaでカスタムの「制約」チェックを実行したくないので、自分の.CLXファイルに設定したいと思います。 – dan2k3k4

+0

@ Dan2k3k4申し訳ありませんが、すぐにはい/いいえの回答を返す明示的なXPath式はありません。 –

1

これは、単一のXPath 1.0式で行うことができない(this similar questionを参照してください、私は今日答えました)。ここで

が単一のXPath 2.0の式(ケースであなたは、XPath 2.0を使用することができます)です。

/*/*[(for $n in name() 
     return count(/*/*[name()=$n]) 
    ) 
    >1 
    ] 

これは、XML文書の最上位の要素の子であるすべての要素を選択し、その回以上起こります。

関連する問題