次の(非常に単純化された)構造を持つドキュメントを解析しようとしています。各ドキュメントには、1つ以上のORBセグメントがあり、その後に1つ以上のOBXセグメントが続きます。OBXセグメントは、先行するOBRセグメントに直接関連しています。
<obr> ...... </obr>
<obx> ...... </obx>
<obx> ...... </obx>
<obx> ...... </obx>
<obr> ...... </obr>
<obx> ...... </obx>
<obx> ...... </obx>
以下は、まだ単純化された例ですが、より詳細です。
<OBR>
<OBR.1>
<OBR.1.1>1</OBR.1.1>
</OBR.1>
<OBR.2/>
<OBR.3>
<OBR.3.1>12345678</OBR.3.1>
<OBR.3.2>PLS</OBR.3.2>
</OBR.3>
<OBR.4>
<OBR.4.1>CRP, LFT, Ue</OBR.4.1>
<OBR.4.2>C Reactive protein, Liver Function Tests, Urea, Elec, Creat</OBR.4.2>
<OBR.4.3>PLS</OBR.4.3>
</OBR.4>
</OBR>
<OBX>
<OBX.1>
<OBX.1.1>1</OBX.1.1>
</OBX.1>
<OBX.2>
<OBX.2.1>NM</OBX.2.1>
</OBX.2>
<OBX.3>
<OBX.3.1>CRP</OBX.3.1>
<OBX.3.2>C-Reactive Protein</OBX.3.2>
<OBX.3.3>PLS</OBX.3.3>
</OBX.3>
</OBX>
複数のテキストと一緒に特定のOBRセグメントからテキストを抽出できるxPath式/Javaコードを開発する必要があります。以下を使用して、ドキュメント全体でインデックスのOBX.3.2を抽出するのは簡単です。
public Object read(String expression, QName returnType, int index) {
expression = "(" + expression + ")[" + Integer.toString(index) + "]";
try {
XPathExpression xPathExpression = xPath.compile(expression);
return xPathExpression.evaluate(xmlDocument, returnType);
} catch (XPathExpressionException ex) {
ex.printStackTrace();
return null;
}
}
しかし、たとえば2番目のOBRに関連付けられているインデックスのOBX.3.2を見つける方法、または実際に各OBRのOBXセグメントの数をカウントする方法がわかりません(これを新しくすると、おそらく問題を解決できます)。ガイダンスやアドバイスをいただければ幸いです。
また、Kayessianメソッド($ ns1 [count(。| $ ns2)= count($ ns2)])を試して、次の要素をカウントしました。
count( //OBR[3]/following-sibling::OBX [ count (.|//OBR[4]/preceding-sibling::OBX) = count(//OBR[4]/preceding-sibling::OBX )])
この式は、インデックス付けされたOBRと次のOBRの下にあるOBX要素の数を示します。ただし、グループ内の最後のOBRは正しく処理されません(その後にORBがないため)。