Я не могу придумать простой и элегантный способ поиска «предыдущих» и «следующих» элементов в документе XML с использованием XPath или простого шаблона XSLT.Вот пример XML-документа (в реальном документе @id
не будет упорядочен так просто)
<manual>
<section id="1">
<section id="2">
<section id="3"/>
<section id="4"/>
<section id="5"/>
</section>
<section id="6">
<section id="7"/>
<section id="8"/>
<section id="9"/>
</section>
</section>
<section id="10"/>
<section id="11">
<section id="12"/>
</section>
</manual>
А вот что я имею в виду под предыдущим / последующим в порядке документов
+------------------+------------------+--------------+
| Selected section | Previous section | Next section |
+------------------+------------------+--------------+
| 1 | none | 2 |
| 2 | 1 | 3 |
| 3 | 2 | 4 |
| 4 | 3 | 5 |
| 5 | 4 | 6 |
| ... | ... | ... |
| 10 | 9 | 11 |
| 11 | 10 | 12 |
| 12 | 11 | none |
+------------------+------------------+--------------+
Проблема с осью preceding::
заключается в том, что предки исключаются, т. Е. section[id=2]
не является предшествующим узлом section[id=3]
.
Таким же образом, ось following::
исключаетпотомки, то есть section[id=3]
не является следующим узлом для section[id=2]
.
Итак, как я могу создать «предыдущий» и «следующий» элементы, например, из этих шаблонов:
<xsl:template match="section" mode="prev">
<xsl:value-of select="... what to put here ..."/>
</xsl:template>
<xsl:template match="section" mode="next">
<xsl:value-of select="... what to put here ..."/>
</xsl:template>
Примечаниеэто аналогичный, но не тот же вопрос: XPath 1.0, ближайший предшествующий узел и / или узел-предок с атрибутом в дереве XML .Эти конструкции XPath действительно у меня над головой, иногда ...