wedata:400でcount()を使用した意図 その2
前回のエントリにGrieverさんからコメントを頂きました。
前回の記事も読ませていただいきましたが、私は items/400 は 2 パターンだと解釈しています。
(//article | //*[starts-with(@id, 'post-')]) と id('content')/div[contains(@class,'post')] ですね。
article も starts-with(@id, 'post-') も単体ではどこにマッチするかわかりませんが、兄弟が複数存在する場合に限定することで「記事一覧」にマッチするように仕組まれています。(ときどき個別記事の関連記事一覧を取得して誤爆していますが…)
実際に div[@id='post-1234'] や article[@id='post-1234'] のような使われ方のページが非常に多く、区別する必要がないと思っています。
id('content')/div[contains(@class,'post')] は別パターンですが一応 div を数えて複数存在する場合に動作させようという意図が見えます。
この「複数存在する場合」という条件が Generic Post"s" Rule の要だと思います。
また重複を気にされてますが、同じ要素を二重に取得するわけではないので重複しても問題ないですが…。
wedata:400でcount()を使用した意図 - 1300
さきほどupdateを行いました。しつこいようですがこれしかできません。
http://wedata.net/items/400?rev=154703
コメントありがとうございます。//articleと//*[starts-with(@id,"post-")]のいずれか、あるいはこの重複に適用されるかを明確にしなければどこに適用されるか怖いと思うのですが…単に私が小心者なだけでしょうか。
exampleUrlを5ケースに分離したのはそれなりに意義があると言わせてください。なぜ骨を折ったのかと悲しくなります。機能上は構わないのかもしれませんがexampleUrlを整理したのが無駄とは考えたくありません。
同一階層内に複数存在するかどうかの見落としに関しては、完全に私のミスです。親ノードから見てこんな条件式を付け加えました。
count(./article)>1 or count(./*[starts-with(@id,"post-")])>1
一応提示していただいたテストケースには対応しているようです。まだおかしな点があれば遠慮なくおっしゃってください。
追記
以下の条件式で適用を回避したいケースを簡単に書きました。意図が伝わるでしょうか。
count(//article)=count(//*[starts-with(@id,"post-")]) or count(//article)=count(//*[starts-with(@id,"post-")])*2 or count(//article)*2=count(//*[starts-with(@id,"post-")]) or count(//article)<2 or count(//*[starts-with(@id,"post-")])<2