使用通配符在XPath中匹配属性

8

我正在开发一个基于 .net 2.0 的 asp.net 应用程序。

在处理 XML 时,我遇到了一些问题。

假设我有以下的 XML:

<person name="xxxyx" age="32" />

<person name="zzz" age="32" />

<person name="yyyxx" age="32" />

现在我想选择名字中包含yx的人。
我该如何使用xpath实现呢?
我只知道这个表达式只会匹配名字恰好为"yx"的人:
"//person[name='yx'"]"

如何进行模糊搜索?

顺便问一下,有没有想法可以按指定属性(例如“姓名”)对匹配的人进行排序?


排序应该如何进行?这是否涉及XSL转换? - hielsnoppe
这应该会有所帮助:http://stackoverflow.com/questions/5607592/xpath-and-wildcards/5607636#5607636 - Wayne
2个回答

9

像 @Utkanos 建议的那样,//person[contains(@name, 'yx')] 应该匹配您想要的节点。

XPath 本身不具备并且也没有意图在节点上提供排序,而是返回“无序节点集合,不包含重复项”的节点集(请参见 1 和评论)。然而,在版本 2.0 中可能会对此进行更改 2,但我不熟悉这方面的内容。

假设排序应该在 XSL 转换中完成,您可以使用 <xsl:sort />,如下所示:

<xsl:apply-templates select="//person[contains(@name, 'yx')]">
    <xsl:sort select="@name" />
</xsl:apply-templates>

这里有一些关于<xsl:sort />的更多属性,文档在这里:http://www.w3.org/TR/xslt#sorting


2
在XPath 2.0(甚至3.0)中,独立的XPath仍然没有排序能力 - 您需要使用XSLT或XQuery。 - Michael Kay

8
使用contains()函数。
//person[contains(@name, 'yx')]

另外,请注意在name前面需要加上@,因为它是一个属性。

演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接