Я пытаюсь проанализировать документ, имеющий следующую (значительно упрощенную) структуру.Каждый документ может иметь один или несколько сегментов ORB, за которыми следует один или несколько сегментов 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>
Мне нужно разработать и выражение xPath / код Javaкоторый может извлекать текст из определенного сегмента OBR вместе с кратным текстом.Извлечь индекс 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;
}
}
Но я не уверен, как найти индекс OBX.3.2, связанный, скажем, со вторым OBR илидействительно, как посчитать количество сегментов OBX для каждого OBR (если я это новое, я, вероятно, мог бы решить проблему).Любое руководство или совет будет высоко ценится.
Я также попробовал метод Кейса ($ ns1 [count (. | $ Ns2) = count ($ ns2)]) для подсчета элементов, дающих:
count( //OBR[3]/following-sibling::OBX [ count (.|//OBR[4]/preceding-sibling::OBX) = count(//OBR[4]/preceding-sibling::OBX )])
Это выражение дает число элементов OBX ниже индексированного OBR и следующего OBR.Однако он неправильно обрабатывает последний OBR в группе (поскольку после него нет ORB)