Я думаю, что это работает. Он находит последнее последовательное вхождение (после времени запуска) store / @ id, где @id = $ id, что, как я полагаю, вы искали.
<xsl:variable name="id" select="'1045'"/>
<xsl:variable name="st" select="translate('12:40',':','')"/>
...
((//h[translate(@hm,':','') >= $st])[position() = count(preceding-sibling::*[store/@id=$id])+1 and store/@id=$id])[last()]/@hm
Пояснение:
Сначала выберите все элементы, которые имеют время начала> = до указанного начала. Затем в этих результатах выберите атрибут @hm последнего элемента, позиция которого равна числу предыдущих элементов, в которых есть запрошенный тег store / @ id.
Единственное ограничение в этой короткой версии состоит в том, что она не будет работать, если идентификатор хранилища не появится в первом элементе после времени запуска. Нижеследующее исправляет это ограничение, начиная с первого после времени запуска, которое содержит надлежащий store / @ id, но это немного запутанно:
<xsl:variable name="id" select="'1045'"/>
<xsl:variable name="st" select="translate('12:40',':','')"/>
...
((//h[translate(@hm,':','') >= $st and position() >= count(//h[not(preceding-sibling::*[store/@id=$id])])])[position() = count(preceding-sibling::*[store/@id=$id])+1 and store/@id=$id])[last()]/@hm