为何XPath的local-name函数配合/*仅返回首个XML子元素的本地名称?
问题原因及解决方案
嘿,这个问题我之前也踩过坑!其实核心原因是XPath版本的差异在作怪~
为什么只返回第一个子元素的名称?
在XPath 1.0中,local-name()函数有个特性:如果传入的参数是一个节点集,它只会返回该节点集里第一个节点的本地名称。你的表达式/document/*确实选中了<document>下的所有子元素,但XPath 1.0的local-name()只会处理第一个匹配的节点,所以你只得到了item_0001。
怎么获取所有子元素的本地名称?
根据你使用的XPath版本,有两种解决方式:
1. 使用XPath 2.0及以上版本
如果你的环境支持XPath 2.0+(比如XQuery、Saxon处理器、现代编程语言中的XPath库等),直接用local-name(/document/*)就可以返回所有子元素的本地名称序列,结果会是:item_0001, item_0002, item_0003, item_0004, other_0001, other_0002
2. 局限在XPath 1.0环境
如果只能用XPath 1.0,就得通过迭代节点集来逐个获取名称:
- 比如在XSLT 1.0中,可以用循环遍历每个子元素:
<xsl:template match="/"> <xsl:for-each select="/document/*"> <xsl:value-of select="local-name(.)"/> <xsl:text> </xsl:text> <!-- 加个空格分隔结果 --> </xsl:for-each> </xsl:template>
- 如果是在其他支持XPath 1.0的工具中,也可以遍历
/document/*返回的节点列表,对每个节点单独调用local-name(.)来获取名称。
内容的提问来源于stack exchange,提问作者David J.
相关产品推荐
相关产品推荐

