XPath для выбора нескольких тегов

Понятно и просто: если есть какой-либо код, который нужно совместно использовать в нескольких местах, он должен перейти в другой класс, который можно использовать в качестве зависимости, где это необходимо. Перечисленные зависимости не кажутся слишком большими, хотя вам следует тщательно продумать, нужна ли вам зависимость от HttpContext. Большую часть времени вам следует просто передать какое-то значение методу. Например, если вам нужно работать с идентификатором пользователя, передайте идентификатор пользователя в метод вашего вспомогательного класса, вместо того, чтобы заставить вспомогательный класс получить зависимость от HttpContext и получить сам идентификатор.

Если у вас все еще слишком много зависимостей, то вы, вероятно, нарушаете принцип единой ответственности. Вам может понадобиться несколько вспомогательных классов или совершенно другая стратегия. Трудно сказать что-то определенное, не зная точно, что вы делаете.

119
задан Keavon 20 May 2014 в 02:43
поделиться

3 ответа

Один корректный ответ:

/a/b/*[self::c or self::d or self::e]

Действительно обратите внимание что это

a/b/*[local-name()='c' or local-name()='d' or local-name()='e']

является и слишком длинным и неправильным. Это выражение XPath выберет узлы как:

OhMy:c

NotWanted:d 

QuiteDifferent:e
194
ответ дан Dimitre Novatchev 24 November 2019 в 01:49
поделиться

Можно избежать повторения с тестом атрибута вместо этого:

a/b/*[local-name()='c' or local-name()='d' or local-name()='e']

Вопреки антагонистическому мнению Dimitre вышеупомянутое весьма корректно в вакууме, где OP не указал взаимодействие с пространствами имен. self:: ось является строгим пространством имен, local-name() не. Если намерение OP состоит в том, чтобы получить c|d|e независимо от пространства имен (то, которое я предложил бы, является даже вероятным сценарием, данным ИЛИ природа проблемы) затем это - "другой ответ, который все еще имеет некоторые положительные голоса", который является неправильным.

Вы не можете быть категоричными без определения, хотя я довольно рад удалить свой ответ как по-настоящему неправильный, если OP разъясняет его вопрос, таким образом, что я являюсь неправильным.

43
ответ дан the Tin Man 24 November 2019 в 01:49
поделиться

Не уверенный, если бы это помогает, но с XSL, я сделал бы что-то как:

<xsl:for-each select="a/b">
    <xsl:value-of select="c"/>
    <xsl:value-of select="d"/>
    <xsl:value-of select="e"/>
</xsl:for-each>

и не будет этот XPath выбирать всех детей узлов B:

a/b/*
-1
ответ дан Calvin 24 November 2019 в 01:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: