如何检查元素名称是否包含特定字符串?

时间:2010-08-07 21:56:30

标签: xslt xpath

源文档如下:

<a>
 <b n=n1n1n1n1>
 <c1> drftgy </c1>
 </b>
<c2> dddd </c2>
</a>

如何检查元素名称= c然后我们会做点什么......

2 个答案:

答案 0 :(得分:7)

使用许多标准XPath函数

要查找当前节点的名称是否以字符串"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]$')]