XSLT 1.0 (или Xpath1.0) это позволяет?
Ниже приведено правильное выражение XPath 1.0 :
root/sub-root/parent/child/grand_child
/dummy1/dummy2/dummy3/dummy4
/*
[starts-with(name(), 'node_')
and
substring-after(name(), 'node_') >= 1
and
not(substring-after(name(), 'node_') > $N)
]
Однако шаблоны соответствия являются лишь подмножеством всех выражений XPath , и к ним применяются определенные ограничения. В частности, в XSLT 1.0 они не могут содержать ссылку на xsl: variable .
В случае, если значение N статически известно, тогда подставляется это буквальное значение (скажем, 1000) в приведенном выше выражении XPath, и, таким образом, у него будет действительный шаблон соответствия XSLT 1.0.
Обратите внимание, что это крайний случай , и крайне маловероятно, что при любых практических обстоятельствах потребуется такой длинный шаблон сопоставления. По определению шаблон сопоставления не должен указывать полный путь к узлу - только достаточный «from-right-subpath», который устраняет неоднозначность узла с другими узлами с тем же именем, которые должны обрабатываться другим шаблоном.
Таким образом, в большинстве случаев будет достаточно даже :
*
[starts-with(name(), 'node_')
and
substring-after(name(), 'node_') >= 1
and
not(substring-after(name(), 'node_') > {N})
]
где {N} должен быть заменен целочисленным литералом - фактическое значение $ N.
Или, в самом простом случае (случается довольно часто), если есть четыре узла и нет необходимости в устранении неоднозначности , нужно просто использовать:
node_1|node_2|node_3|node_4