Требуется найти значение сегмента MAN02 в HL1Loop, который имеет HL03 = 'P' и HL01 = '3' (в файле, который потенциально содержит десятки HL1Loops, но я включил только пару для целей воспроизведения вопроса.)
Я так много работал:
//*[local-name()='HLLoop1'][.//*[HL03='P'] and .//*[HL01='3']]
вернет желаемый HLLoop1 (с примерами данных ниже). У меня есть причина для получения этого конкретного элемента, слишком длинная, чтобы объяснять здесь (разбор схемы Microsoft BizTalk, представляющей документ предварительного уведомления 856 EDI). Могут быть и другие HLLoop1, в которых также есть «MAN02», и это то, что мне нужно.
Теперь я хочу вернуть только значение MAN02.
Пробовал это, но это не пойдет:
//*[local-name()='HLLoop1']//MAN/MAN02[.//*[HL03='P'] and .//*[HL01='3']]
Нужно ли мне добавлять дополнительные префиксы, чтобы HL03 мог возвращаться на несколько узлов, что-то вроде этого?
//*[local-name()='HLLoop1']//MAN/MAN02[.//.//.//*[HL03='P'] and .//.//.//*[HL01='3']]
или я бы добавил в конец что-то вроде этого:
//*[local-name()='HLLoop1'][.//*[HL03='P'] and .//*[HL01='3']]//*MAN02
Это дает "дополнительные нелегальные токены", и я думаю, что, возможно, добавление большего количества скобок в нужных местах исправит это.
Я знаю, что это вопрос прояснения осей и положения "где".
Пример здесь:
http://www.xpathtester.com/xpath/3005df62b369fd0fff86e7b3e492a377
Данные
<ns0:X12_00401_856 xmlns:ns0="http://schemas.microsoft.com/BizTalk/EDI/X12/2006">
<ns0:HLLoop1>
<ns0:HL>
<HL01>2</HL01>
<HL02>1</HL02>
<HL03>O</HL03>
</ns0:HL>
<ns0:PRF>
<PRF01>287775</PRF01>
</ns0:PRF>
</ns0:HLLoop1>
<ns0:HLLoop1>
<ns0:HL>
<HL01>3</HL01>
<HL02>2</HL02>
<HL03>P</HL03>
</ns0:HL>
<ns0:MAN>
<MAN01>CP</MAN01>
<MAN02>465467995515</MAN02>
</ns0:MAN>
</ns0:HLLoop1>
</ns0:X12_00401_856>
Я буду использовать его XSLT, что-то вроде этого:
<LineItemCarrierTrackingNum>
<xsl:variable name="currentHL02" select="HL02" />
<xsl:value-of select="concat("//*[local-name()='HLLoop1'][.//*[HL03='O'] and ..//*[HL01='", $currentHL02,"']]//*MAN02"; />
</LineItemCarrierTrackingNum>
Я надеюсь, что смогу собрать XPath как переменную, как показано выше ...