Я перемещаюсь внутри сообщений EDIFACT (плохо), заключенных в сообщения XML, используя стандартные оси XPath версии 2.0.Ниже приведена краткая выдержка:
<Loop type="RFF">
<RepeatingSegment type="RFF">
<Segment type="RFF" name="REFERENCE">
<Element type="1153" name="Reference qualifier" value="Order number (purchase)">ON</Element>
<Element type="1154" name="Reference number">0104772302</Element>
</Segment>
<Segment type="RFF" name="REFERENCE">
<Element type="1153" name="Reference qualifier" value="Delivery note number">DQ</Element>
<Element type="1154" name="Reference number">052620228</Element>
</Segment>
</RepeatingSegment>
<RepeatingSegment type="DTM">
<Segment type="DTM" name="DATE/TIME/PERIOD">
<Element type="2005" name="Date/time/period qualifier" value="Reference date/time">171</Element>
<Element type="2380" name="Date/time/period">20180207</Element>
<Element type="2379" name="Date/time/period format qualifier" value="CCYYMMDD">102</Element>
</Segment>
</RepeatingSegment>
</Loop>
Стандартный топор XPath «follow-sibling», даже принудительный с [1], возвращает уникальную дату (DTM) для первой ссылки (RFF), но эту датупринадлежит второй ссылке (RFF)…
/Loop[@type='RFF']/RepeatingSegment[@type='RFF']/Segment[@type='RFF']/Element[@type=1153 and text()='ON']/../../following-sibling::RepeatingSegment[@type='DTM'][1]/Segment[@type='DTM']/Element[@type=2380]
возвращает «20180207».Итак, я ищу трюк, который мог бы вернуть «сиамскую» дату (или ничего, если эта дата не существует, как в приведенном выше фрагменте).
Термин «сиамский» не ясен: яСейчас я использую термин «пара».В идеале, если сообщение XML было завершено, это должны быть две пары Reference-Date, к сожалению, в разные группы RepeatingSegment (именно поэтому я впервые упомянул, что сообщение EDIFACT плохо упаковано устаревшей системой).
Если для каждой ссылки есть две разные даты, то, как показано ниже во второй выдержке, следующий топор можно выбрать после каждой ссылки:
<Loop type="RFF">
<RepeatingSegment type="RFF">
<Segment name="REFERENCE" type="RFF">
<Element name="Reference qualifier" type="1153" value="Order number (purchase)">ON</Element>
<Element name="Reference number" type="1154">0CDE922802</Element>
</Segment>
</RepeatingSegment>
<RepeatingSegment type="DTM">
<Segment name="DATE/TIME/PERIOD" type="DTM">
<Element name="Date/time/period qualifier" type="2005" value="Reference date/time">171</Element>
<Element name="Date/time/period" type="2380">20170619</Element>
<Element name="Date/time/period format qualifier" type="2379" value="CCYYMMDD">102</Element>
</Segment>
</RepeatingSegment>
<RepeatingSegment type="RFF">
<Segment name="REFERENCE" type="RFF">
<Element name="Reference qualifier" type="1153" value="Delivery note number">DQ</Element>
<Element name="Reference number" type="1154">00000004</Element>
</Segment>
</RepeatingSegment>
<RepeatingSegment type="DTM">
<Segment name="DATE/TIME/PERIOD" type="DTM">
<Element name="Date/time/period qualifier" type="2005" value="Reference date/time">171</Element>
<Element name="Date/time/period" type="2380">20180726</Element>
<Element name="Date/time/period format qualifier" type="2379" value="CCYYMMDD">102</Element>
</Segment>
</RepeatingSegment>
</Loop>
Но когда первая дата отсутствует, как впервый фрагмент выше, топор следующего брата выбирает дату второй ссылки (которая является первым появлением даты, так как первая дата отсутствует).Итак, да, вышеупомянутое выражение XPath работает нормально.
Вот почему я ищу другое выражение XPath, которое бы ничего не возвращало (пустая строка) вместо первой следующей «плохой» даты.Фактически, должен быть полезен своего рода топор «следующего соседа», который еще не существует в XPath.