XSLT 2.0 удаляет одноуровневый узел на основе позиции и имени - PullRequest
0 голосов
/ 18 октября 2018

У меня есть следующее, которое иногда появляется в xml-файле (namespace tei):

<tei:p>some text</tei:p><tei:add>some note</tei:add>

Моя цель - удалить ТОЛЬКО <add/>, когда это следующий брат после ПОСЛЕ <p>, ине другие <add/> элементы, которые могут появиться в файле.

Я пробовал это в XSLT 2.0, но безрезультатно:

<xsl:template match="tei:add[preceding-sibling::node()[1][local-name()='p']]"/>

Спасибо за любую помощь.

1 Ответ

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

Пример кода, который вы показали, должен работать, но только если нет пробелов (например, новой строки) между p и add (потому что текст также считается узлами)

Если вымежду ними может быть пробел, который вы хотите игнорировать. Одно из решений состоит в удалении пробелов только узлов из XML, используя strip-space в вашем XSLT

<xsl:strip-space elements="*" />

В качестве альтернативы, вы можете изменить свой шаблонсопоставить с учетом узлов пробелов

 <xsl:template match="tei:add[preceding-sibling::node()[self::* or normalize-space()][1][local-name()='p']]"/>

Вы могли бы изменить его на это, если бы между ними никогда не было узла без пробелов

<xsl:template match="tei:add[preceding-sibling::*[1][local-name()='p']]"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...