我想使用XPath来获取XML文件中出现的所有元素的名称列表.但是,我不希望重复任何名称,因此不应匹配与前一个元素同名的元素.到目前为止,我有:
*[not(local-name() = local-name(preceding::*))]
Run Code Online (Sandbox Code Playgroud)
这执行正常,但它会重复出现.为什么要吐出重复的内容,如何消除它们?(我正在使用Firefox的XPath引擎.)
您正在获得重复项,因为您的过滤器未按您认为的方式进行评估.
该本地名称()函数返回的本地名称第一节点在节点集.
谓词过滤器唯一有效的时间是元素恰好与第一个前一个元素具有相同的名称.
我不认为你能用纯XPATH 1.0灵魂来完成你想要的东西.您可以在XPATH 2.0中执行此操作,但这不适用于Firefox.
在XSLT中,您可以使用meunchien方法来完成您想要的任务.
以下是一个例子.您没有提供任何示例XML,因此我保持非常通用(例如//*匹配doc中的所有元素):
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"><xsl:output method="xml"/>
<xsl:key name="names" match="//*" use="local-name(.)"/>
<xsl:template match="/">
<xsl:for-each select="//*[generate-id(.) = generate-id(key('names', local-name(.)))]">
<!--Do something with the unique list of elements-->
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)