XSLT 1.0: как перейти на «родительскую» ось - PullRequest
3 голосов
/ 25 января 2012

У меня есть вопрос, касающийся производительности XSLT, вызывающей «родительскую» ось в XPATH. Я могу вызвать родительскую ось, используя ":: *", или я называю ее, используя "::" и имя элемента

parent::*/MVKE/item/VMSTA='Z2'

или

parent::item/MVKE/item/VMSTA='Z2'

Имеет ли значение производительность, если я использую "*" или если я использую имя элемента узла? Оба работают, но мне было интересно, в чем разница. Может кто-нибудь объяснить мне это?

Большое спасибо за вашу помощь и наилучшие пожелания, Питер

Ответы [ 3 ]

3 голосов
/ 25 января 2012

Первое выражение соответствует любому элементу-родителю.Второе выражение соответствует только тогда, когда родительский элемент является элементом item.Это единственная разница.Я не могу представить никакого существенного влияния на производительность, так как оба теста узлов могут выполняться в постоянное время.

Обратите внимание на эту строку из спецификации XPath 1.0 :

Каждый узел, кроме корневого, имеет ровно одного родителя, который является узлом элемента или корневым узлом.

На практике это означает, что parent::* соответствует любому родительскому элементу.кроме того корневого элемента.

Чтобы продемонстрировать, рассмотрим этот простой пример документа:

<root>
    <one/>
    <item>
        <two/>
    </item>
</root>

Тогда:

  • //parent::* даст вам root и item элементов (каждый родительский узел, который является элементом)

  • //parent::item вернет только элемент item (единственный родительский элемент, который является item)

  • //parent::node() даст вам родительский элемент root (т.е. корневой узел), а также root и item элементов

1 голос
/ 13 марта 2017

А как же просто:

<xsl:value-of select="../node()"/>

Дает вам непосредственного родителя. Есть ли, как был первоначальный вопрос, выигрыш в производительности в одном методе V другой?

1 голос
/ 25 января 2012

Это не то же самое, но я сомневаюсь, что будет существенная разница в производительности.

Использование * принимает любой родительский элемент, использование имени потребует, чтобы у родителя было это имя или выЯ получу пустой набор узлов.Следовательно, если бы он был быстрее, он, вероятно, был бы *.

Другой вариант - использовать parent::node() или его краткую форму ..

.
...