XSLT 2.0 / XPATH тестирование родительского элемента в определенной позиции - PullRequest
0 голосов
/ 28 октября 2018

В XSLT 2.0 и XPATH, в пределах <xsl:template match="lb">, я тестирую множество различных case, где каждый случай выдает различный вывод HTML (используя xsl:choose/xsl:when).

Я хочу проверить наследующая ситуация, где lb является самым первым узлом любого вида внутри элемента seg:

<seg><lb break="n"/>text</seg>

В отличие от этого, эти тесты не пройдут:

<seg>text<lb break="n"/>text</seg>

<seg><foo/><lb break="n"/>text</seg>

I 'мы пытались объединить parent и position(), но тестирование выполняется неправильно.

Большое спасибо.

Ответы [ 3 ]

0 голосов
/ 28 октября 2018

Вы можете просто проверить, нет ли предшествующих братьев и сестер:

<xsl:when test="not(preceding-sibling::node())">

Обратите внимание, что node() также включает комментарии и инструкции по обработке, а не только элементы и текст.

В качестве альтернативы,если у вас есть шаблон, соответствующий seg, где вы делаете что-то вроде этого ...

<xsl:template match="seg">
  <xsl:copy>
     <xsl:apply-templates />
  </xsl:copy>
</xsl:template>

Тогда, поскольку <xsl:apply-templates /> - это сокращение от <xsl:apply-templates select="node()" />, вы можете использовать position() в своем шаблоне

<xsl:when test="position() = 1">

Это не сработало бы, если бы шаблон "seg" сделал <xsl:apply-templates select="lb" />.

См. http://xsltfiddle.liberty -development.net / nc4NzRd для примератесты в действии.

0 голосов
/ 28 октября 2018

Наличие шаблона, соответствующего lb, а затем использование xsl:choose/when, на мой взгляд, может быть решено более элегантно и компактно с точными шаблонами сопоставления, например, xsl:template match="seg/node()[1][self::lb]" будет соответствовать любому первому дочернему узлу seg родителя, где находится дочерний элемент.lb элемент.Для других условий вы бы настроили разные шаблоны с разными шаблонами соответствия.

Но вы можете использовать . is parent::seg/node()[1] внутри xsl:template match="lb", чтобы при необходимости написать его наоборот.

0 голосов
/ 28 октября 2018
/seg/child::node()[1]/name() = 'lb'

проверка, если первый ребенок назван "lb"

...