Это правда, что не существует одной оси для перехода от одного атрибута к другому, но, конечно, вы можете добраться туда, объединив оси в цепочку.
Атрибуты не считаются одноуровневыми, поскольку они не считаются "дочерними элементами" родительского элемента, в модели данных, которую использует XPath. Это одна из причин, почему preceding-sibling::
не работает. Это также означает, что имена атрибутов, такие как child1
, child2
и т. д., вводят в заблуждение, поскольку атрибуты не являются «дочерними».
Другая причина, по которой preceding-sibling::
не работает, заключается в том, что порядок атрибутов данный элемент не определен (зависит от реализации). Атрибуты должны быть перечислены в определенном порядке в заданной сериализации (например, в файле), но этот файл может быть проанализирован и выведен снова с атрибутами в другом порядке, и он все равно будет считаться тем же документом из точки информационной модели XML. зрения. Следовательно, в XML нет такого понятия, как «предыдущий» или «предшествующий» атрибут.
Чтобы получить значение атрибута child2
из контекста атрибута child3
, вы можете использовать один из них в зависимости от того, как вы знаете, какой атрибут вам нужен...
../@child2
"Атрибут с именем child2
родительского элемента"
../@*[name() != name(current())]
"Другие атрибуты родительского элемента (не этот)"
Вы могли бы даже попробовать
../@*[2]
но в целом результаты нельзя было бы предсказать, поскольку порядок атрибутов не определен.
Если имена атрибутов включают компонент индекса (1, 2, 3), как в вашем примере, вы можете заменить число в name(current())
на меньшее число.
Чтобы ответить на ваш побочный вопрос, это зависит от того, как определено ваше требование. Если требуется «выбрать предыдущий атрибут», то нет, эта концепция также не определена в XPath 2.
person
LarsH
schedule
30.11.2012