Я хочу получить узел из моего XML-файла, у узла есть префикс, такой как «latest_», но это может измениться, и я стремлюсь, чтобы мой XSLT был как можно более плавным. Вот XPath, который я хочу использовать:
/data/stats/*_cost
Это должно соответствовать latest_cost
, newest_cost
, anything_cost
, есть ли способ сделать это?
Приветствия :-)
Это правильное выражение XPath 1.0, которое выбирает элемент с последними 5 символами имени, равными «_cost» в любом пространстве имен.
/data/stats/*[substring(name(), string-length(name()) - 4) = '_cost']
Вы также можете использовать contains
, например,
/data/stats[contains(.,'_cost')]
stats
, содержащий «_cost». в его строковом значении. Проверьте мой ответ.
–
29.10.2019, 15:32
[contains(local-name(),'_cost')]
, он не дискриминирует позицию, которая является позором, но в контексте его использования это не имеет значения.
– Ben Everard
29.10.2019, 15:33
.
обозначает все текстовое содержимое, и это выражение будет соответствовать всем узлам stats
, текстовое содержимое которых содержит подстроку _const
. Никаких гарантий относительно позиции и имен узлов.
– Alex Nikolaenkov
29.10.2019, 15:33
С XPath 1.0 вы можете использовать шаблон /data/stats/*[substring-after(name(), '_cost') = '']
. Это проверяет, заканчивается ли имя элемента суффиксом _cost
.
В XPath 2.0 есть fn:ends-with(str, str)
, и ваше соответствующее выражение будет *[ends-with(name(), '_cost')]
.
<xsl:for-each select="substring(name(.), string-length(name(.)) - 1) = 'grp'">
Я получаю ошибку: `XPTY0020: Обязательный тип элемента элемента контекста для дочерней оси - это node (); предоставленное значение имеет тип элемента xs: boolean` – Si8 29.10.2019, 15:33