XPath 查找以给定值开头的属性名称

15

使用这个xml:

<div val1="q">a</div>
<div val2="w">b</div>
<div val3="e">c</div>
<div some="r">d</div>
<div thing="t">f</div>
<div name="y">g</div>

我们希望只找到

<div val1="q">a</div>
<div val2="w">b</div>
<div val3="e">c</div>

这些节点具有一个属性,该属性名称val开头。

3个回答

13
你可以尝试这样做:
//div/@*[starts-with(name(.), 'val')]

如果你知道你要查找

元素的第一个属性。

编辑:

抱歉,我没有意识到您想选择元素本身。您可以使用parent::div或您已经做过的操作,但正确的方法是直接选择

本身:

//div[@*[starts-with(name(), 'val')]]

1
我需要获取具有特定属性的div元素。 不是属性及其值,而是 //div/@*[starts-with(name(.), 'val')] - dom1nga
使用 nokogiri 我得到了:"<div val1="q">a</div>".xpath("//div/@*[starts-with(name(.), 'val')]") #=> [#<Nokogiri::XML::Attr:0x80fea968 name="val1" value="q">] - dom1nga
它可以使用//div/@*[starts-with(name(.), 'val')]/..运行。 非常感谢。 - dom1nga
@dom1nga:请查看我的答案,其中包含一个正确的XPath表达式,可以精确选择您需要的节点。 :) - Dimitre Novatchev

0

你尝试过使用.../@val*吗?


//*[@val*]的语法不正确。//*['@val*']返回错误的搜索结果,包含值中的'val',但不包括属性。 - dom1nga

0
哪些节点具有一个属性,该属性名称以val开头? 用途:
//div[@*[starts-with(name(), 'val')]]

这会选择文档中任何具有至少一个属性的 div 元素,其名称以字符串 "val" 开头。

基于 XSLT 的验证

此转换:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
     <xsl:copy-of select="//div[@*[starts-with(name(), 'val')]]"/>
 </xsl:template>
</xsl:stylesheet>

当应用于此XML文档(由提供的XML片段生成):

<html>
    <div val1="q">a</div>
    <div val2="w">b</div>
    <div val3="e">c</div>
    <div some="r">d</div>
    <div thing="t">f</div>
    <div name="y">g</div>
</html>

选择并输出所需节点:

<div val1="q">a</div>
<div val2="w">b</div>
<div val3="e">c</div>

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