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

标签 xslt xpath

源文档如下:

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

如何检查元素名称是否 = c 然后我们将执行某些操作...

最佳答案

使用许多标准 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>

关于xslt - 如何检查元素名称是否包含特定字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3432198/

相关文章:

java - Saxon XSLT 和 NodeList 作为参数

xml - 使用 XSLT 进行简单的 XML 重构

asp.net-mvc - NLog上的配置转换不起作用

xpath - xpath选择两个节点之间的元素

xml - xml的命名空间删除

xml - 如何使用XSL进行划分-但我尝试执行此操作的方式有些棘手

regex - 我如何在 xpath 1.0 中使用正则表达式

Java xPath - 从 XML 中提取子文档

python - 如何使用 Python 从网站获取某些文本?

java - 将我的对象存储库保留在 Selenium 自动化测试框架中的最佳方法是什么