XSLT 2.0 - Как вы можете изменить путь для сравнительных тестов - PullRequest
0 голосов
/ 08 марта 2011

Прямо сейчас я могу получить непосредственные дочерние элементы определенного элемента «корень», и у этих элементов есть имена, которые содержат тире. Например, скажите, что у этих непосредственных детей есть имена «А4-1», «В3-2» и «С4-3».

Я хотел бы иметь возможность сделать что-то вроде следующего псевдо-кода:

for each immediate child
    print out it's child element figtitle/autonum/@ID

Есть ли способ сделать что-то подобное без объединения пути в строку? Каждый раз, когда я соединяю непосредственные дочерние значения с остальной частью его пути, я получаю строку, поэтому не могу сравнить ее значение атрибута с другим значением, например:

<xsl:if test="*['yes' = (PATH)]">
    <xsl:value-of select="PATH[@ID = 'yes']"/> 
</xsl:if>

Где будут пути:

корень / A4-1 / figtitle / autonum / @ ID
корень / B3-2 / figtitle / autonum / @ ID
root / C4-3 / figtitle / autonum / @ ID

1 Ответ

1 голос
/ 09 марта 2011

Требуемое выражение: :

/root/*/figtitle/autonum/@ID

это означает :

Выбрать все ID атрибуты любого autonumэлемент, который является дочерним элементом элемента figtitle, который является внуком верхнего элемента root.

Если элемент root не является верхним элементом документа, то если выражение будетвычисляется с родительским элементом root в качестве узла контекста, выражение должно быть:

root/*/figtitle/autonum/@ID

Объяснение :

Выражение:

someElement/*

выбирает все элементы, которые являются дочерними элементами для элемента с именем someElement, который является дочерним элементом узла контекста (текущего узла), для которого вычисляется выражение.

Таким образом, это вовсе не обязательноявно перечислить имена потомков someElement.

Обновление : ОП пояснила в комментарии, что ей нужно выбрать только тех потомков root, чьи имена содержаттире, цифры и буквы.

Это выражение XPath :

root / * [содержит (name (), '-') и translate (name (), $ vAlphaNum, '') = ''] / figtitle / autonum / @ ID

выбираетточно все такие элементы.

Здесь переменная $vAlphaNum должна быть определена, чтобы содержать все строчные и прописные буквы и цифры 0-9.

В XSLT 2.0 можно использовать matches() функция с подходящим регулярным выражением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...