Используйте ряд стандартных функций XPath :
Чтобы узнать, начинается ли имя текущего узласо строкой "c"
используйте:
starts-with(name(), 'c')
Чтобы узнать, содержит ли имя текущего узла строку "c"
, используйте:
contains(name(), 'c')
Чтобы выбрать все элементы в документе XML,чьи имена начинаются с "c"
, используйте:
//*[starts-with(name(), 'c')]
Чтобы выбрать все элементы в документе XML, чьи имена содержат "c"
, используйте:
//*[contains(name(), 'c')]
Редактировать : ОП задал дополнительный вопрос: Как выбрать все элементы, чье имя - один в наборе имен?
XPath 2.0 :
//*[name(.)= ('c1', 'c2', 'c3')]
Thisиспользует общий оператор сравнения =
и выбирает все элементы в документе, чье имя является одним из строкngs в последовательности ('c1', 'c2', 'c3')
.
Это невозможно сделать только с XPath 1.0,
XSLT 1.0 + XPath 1.0 :
Это преобразование :
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my" >
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<my:names>
<name>c1</name>
<name>c2</name>
<name>c3</name>
</my:names>
<xsl:variable name="vNames" select=
"document('')/*/my:names/*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:copy-of select="//*[name()=$vNames]"/>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному XML-документу (исправлено, чтобы быть правильно сформированным):
<a>
<b n="n1n1n1n1">
<c1> drftgy </c1>
</b>
<c2> dddd </c2>
</a>
дает желаемый результат :
<c1> drftgy </c1>
<c2> dddd </c2>