Используйте
(//div[@class='message'])[$k]//@*
При этом выбираются все три атрибута, которые принадлежат $ k-й div
(и любым его потомкам) в документе, атрибут class
которого имеет строковое значение "message"
Вы можете оценить N
таких выражений XPath - для $k
от 1 до N
, где N
- это общее число //div[@class='message']
Проверка на основе 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:for-each select="//div[@class='message']">
<xsl:variable name="vPos" select="position()"/>
<xsl:apply-templates select=
"(//div[@class='message'])[0+$vPos]//@*"/>
================
</xsl:for-each>
</xsl:template>
<xsl:template match="@*">
<xsl:value-of select=
"concat('name = ', name(), ' value = ', ., '
')"/>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к предоставленному документу XML (обернутым в один верхний элемент, чтобы стать правильно сформированным):
<html>
<div class='message'>
<div>
<a href='http://www.whatever.com'>Text</a>
</div>
<div>
<img src='image_link.jpg' />
</div>
</div>
<div class='message'>
<div>
<a href='http://www.whatever2.com'>Text2</a>
</div>
<div>
<img src='image_link2.jpg' />
</div>
</div>
</html>
Выражение XPath вычисляется дважды, а выбранные атрибуты форматируются и выводятся :
name = class value = message
name = href value = http://www.whatever.com
name = src value = image_link.jpg
================
name = class value = message
name = href value = http://www.whatever2.com
name = src value = image_link2.jpg
================