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

use*_*802 2 xslt xpath

源文档是这样的:

<a>
 <b n=n1n1n1n1>
 <c1> drftgy </c1>
 </b>
<c2> dddd </c2>
</a>
Run Code Online (Sandbox Code Playgroud)

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

Dim*_*hev 7

使用许多标准XPath函数:

要查找当前节点的名称是否以字符串"c"use 开头:

starts-with(name(), 'c')
Run Code Online (Sandbox Code Playgroud)

要查找当前节点的名称是否包含字符串,请"c"使用:

contains(name(), 'c')
Run Code Online (Sandbox Code Playgroud)

要选择XML文档中名称以"c"use 开头的所有元素:

//*[starts-with(name(), 'c')]
Run Code Online (Sandbox Code Playgroud)

要选择XML文档中名称包含"c"use的所有元素:

//*[contains(name(), 'c')]
Run Code Online (Sandbox Code Playgroud)

编辑:OP提出了另一个问题:如何选择名称为一组的所有元素?

XPath 2.0:

  //*[name(.)= ('c1', 'c2', 'c3')]
Run Code Online (Sandbox Code Playgroud)

这将使用常规比较运算符, =并选择文档中名称为序列中 某个字符串的所有元素('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>
Run Code Online (Sandbox Code Playgroud)

当应用于提供的XML文档(更正为格式良好)时:

<a>
 <b n="n1n1n1n1">
 <c1> drftgy </c1>
 </b>
<c2> dddd </c2>
</a>
Run Code Online (Sandbox Code Playgroud)

产生想要的结果:

<c1> drftgy </c1>
<c2> dddd </c2>
Run Code Online (Sandbox Code Playgroud)