XPath найти атрибуты, где имя начинается с заданного значения

С помощью этого 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>

которые являются теми узлами, у которых атрибут name начинается с val

Ответы

Ответ 1

Вы можете попробовать следующее:

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

если вы знаете, что ищете первый атрибут элемента div.

Edit:

Извините, вы не поняли, что хотите сами выбрать элементы. Вы можете использовать parent:: div или то, что вы сделали, но правильным способом сделать это было бы непосредственно выбрать div:

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

Ответ 2

Вы пробовали с... /@val *?

Ответ 3

которые являются теми узлами, у которых есть атрибут, где имя атрибута начинается с 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>