Подстановочные знаки XPath для имени узла

Я хочу получить узел из моего XML-файла, у узла есть префикс, такой как «latest_», но это может измениться, и я стремлюсь, чтобы мой XSLT был как можно более плавным. Вот XPath, который я хочу использовать:

/data/stats/*_cost

Это должно соответствовать latest_cost, newest_cost, anything_cost, есть ли способ сделать это?

Приветствия :-)

42
задан 29.10.2019, 15:32

4 ответа

Это правильное выражение XPath 1.0, которое выбирает элемент с последними 5 символами имени, равными «_cost» в любом пространстве имен.

/data/stats/*[substring(name(), string-length(name()) - 4) = '_cost']
65
ответ дан 29.10.2019, 15:33
  • 1
    Я попробовал это: <xsl:for-each select="substring(name(.), string-length(name(.)) - 1) = 'grp'"> Я получаю ошибку: `XPTY0020: Обязательный тип элемента элемента контекста для дочерней оси - это node (); предоставленное значение имеет тип элемента xs: boolean` – Si8 29.10.2019, 15:33
  • 2
    Справедливо, я ввел это в свое приложение, и оно делает то, что мне нужно, без других недостатков, см. Мой комментарий к reqsquare. Благодарю. – Ben Everard 29.10.2019, 15:33
  • 3
    @ILMV: добро пожаловать. Я рад, что это помогает вам. –  29.10.2019, 15:34
  • 4
    +1 и спасибо @ user357812 - это было очень полезно для моего аналогичного варианта использования (соответствующие суффиксы атрибутов). Как это сделать, здесь , если кому-то интересно. – halfer 29.10.2019, 15:34
  • 5
    другой довольный клиент (-: – robert 29.10.2019, 15:34

Вы также можете использовать contains

, например,

/data/stats[contains(.,'_cost')] 
6
ответ дан 29.10.2019, 15:32
  • 1
    Это не верно. При этом выбирается элемент stats, содержащий «_cost». в его строковом значении. Проверьте мой ответ. –  29.10.2019, 15:32
  • 2
    В конце я остановился на этом [contains(local-name(),'_cost')], он не дискриминирует позицию, которая является позором, но в контексте его использования это не имеет значения. – Ben Everard 29.10.2019, 15:33
  • 3
    . обозначает все текстовое содержимое, и это выражение будет соответствовать всем узлам stats, текстовое содержимое которых содержит подстроку _const. Никаких гарантий относительно позиции и имен узлов. – Alex Nikolaenkov 29.10.2019, 15:33
  • 4
    /data/stats/*[contains(local-name(),'_cost')] будет работать, хотя ... – annakata 29.10.2019, 15:34

С XPath 1.0 вы можете использовать шаблон /data/stats/*[substring-after(name(), '_cost') = '']. Это проверяет, заканчивается ли имя элемента суффиксом _cost.

В XPath 2.0 есть fn:ends-with(str, str), и ваше соответствующее выражение будет *[ends-with(name(), '_cost')].

6
ответ дан 29.10.2019, 15:33
  • 1
    [substring-after (name (), '_cost') = ''] Это также верно для любого name (), которое не содержит _cost, -1 – FCR 29.10.2019, 15:33
  • 2
    @Alejandro, спасибо, что указал на мою ошибку. – Alex Nikolaenkov 29.10.2019, 15:34
  • 3
    как указывает @ILMV, будет выбран элемент без & quot; _cost & quot; в его названии. Проверьте мой ответ. –  29.10.2019, 15:34
  • 4
    Спасибо за ваш ответ, сработал для меня хорошо, так как он проверил, если строка также существует. Кроме того, в моем окружении нет XPath 2. В любом случае, ура :-) – Ben Everard 29.10.2019, 15:35

Вышесказанное не сработало для меня. Мне пришлось «слегка» изменить это следующим образом:

/data/stats/*[contains(name(),'_cost')]
4
ответ дан 29.10.2019, 15:34

Теги

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