データが Marklogic に存在すると確信しているのに、単純な xpath がデータを返さないという奇妙な問題が発生しました。問題のデータは、より一般的な xpath で確認できますが、具体的には取得できません。
動作するxpath:
/log:record[log:changes/log:change/@field = "moduleCodes"]
=> a long sequence of log:record elements with "moduleCodes" field changes
次のことを行わない xpath:
/log:record/log:changes/log:change[@field = "moduleCodes"]
=> empty sequence
(log
名前空間定義の簡潔さは省略しました。)
何が起こっているのかを把握しようとして、最初の作業中の xpath から始めて、それに基づいて構築しました。
/log:record[log:changes/log:change/@field = "moduleCodes"]/log:changes/log:change
=> sequence of log:change elements including some with @field = "moduleCodes"
/log:record[log:changes/log:change/@field = "moduleCodes"]/log:changes/log:change[@field]
=> sequence of log:change elements including some with @field = "moduleCodes"
/log:record[log:changes/log:change/@field = "moduleCodes"]/log:changes/log:change[@field = "moduleCodes"]
=> empty sequence
基本的なことを誤解していますか?他のすべてが期待どおりに機能するのに、述語を配置する xpaths がlog:change
空のシーケンスを返す理由がわかりません。これは、Marklogicがどういうわけか混乱しているように感じますが、そのように話し始める前に、xpathの微妙な点が欠けているだけではないことを確認したいと思います。
別のフィールド名でパスを試しました。(少なくともいくつかの)他の値で期待どおりに機能します。
ML クラスターを再起動しました。変化なし。
編集:
上記の xpath はすべて Oxygen で正常に動作するため、このように動作しているのは ML だけのようです。fn:doc()
それが助けになった場合に備えて、すべてのパスの前に追加しようとしましたが、違いはありませんでした。
以下は、すべての xpath に一致すると思われる (匿名化された) レコードです。
<log:record id="00000001" date="2013-04-14T01:42:02.922+01:00" type="change" xmlns:log="some/namespace/definition">
<log:head>
<some-header-info/>
</log:head>
<log:changes>
<log:change field="dateModified">
<log:old-value>2012-11-06T00:00:00.0000000</log:old-value>
<log:new-value>2013-03-20T00:00:00.0000000</log:new-value>
</log:change>
<log:change field="moduleCodes">
<log:old-value>
<log:moduleCodes>
<log:moduleCodes-value code="AAA"/>
</log:moduleCodes>
</log:old-value>
<log:new-value>
<log:moduleCodes>
<log:moduleCodes-value code="AAA"/>
<log:moduleCodes-value code="BBB"/>
</log:moduleCodes>
</log:new-value>
</log:change>
</log:changes>
</log:record>