源文档如下:
<a>
<b n=n1n1n1n1>
<c1> drftgy </c1>
</b>
<c2> dddd </c2>
</a>
如何检查元素名称= c然后我们会做点什么......
答案 0 :(得分:7)
使用许多标准XPath函数:
<强> name()
强>
<强> contains()
强>
<强> starts-with()
强>
ends-with()
(仅限XPath 2.0)
要查找当前节点的名称是否以字符串"c"
开头,请使用:
starts-with(name(), 'c')
要查找当前节点的名称是否包含字符串"c"
,请使用:
contains(name(), 'c')
要选择XML文档中名称以"c"
开头的所有元素,请使用:
//*[starts-with(name(), 'c')]
要选择XML文档中名称包含"c"
的所有元素,请使用:
//*[contains(name(), 'c')]
编辑:OP提出了另一个问题:如何选择名称为一组的所有元素?
XPath 2.0 :
//*[name(.)= ('c1', 'c2', 'c3')]
这使用一般比较运算符 =
并选择文档中名称为序列 ('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>
答案 1 :(得分:1)
使用XPath 2.0和XQuery 1.0,您可以使用//*[local-name() = ('c1', 'c2', 'c3')]
,也可以使用正则表达式匹配,例如//*[matches(local-name(), '^c[123]$')]
。