В XPath 2.0 используйте одно выражение, подобное этому :
sum(../Store/@name/string-length(.))
Это невозможно сделать с помощью одного выражения XPath 1.0 (функция в качестве местоположенияшаг запрещен), поэтому требуется некоторая помощь языка хостинга.
Например, если язык хостинга - XSLT :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/*">
<xsl:apply-templates select="Store[@name][1]"/>
</xsl:template>
<xsl:template match="Store[@name]">
<xsl:param name="vAccum" select="0"/>
<xsl:value-of select="$vAccum + string-length(@name)"/>
</xsl:template>
<xsl:template match="Store[@name and following-sibling::Store/@name]">
<xsl:param name="vAccum" select="0"/>
<xsl:apply-templates select="following-sibling::Store[@name][1]">
<xsl:with-param name="vAccum" select="$vAccum + string-length(@name)"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к следующему документу XML :
<root>
<Store name="ab"/>
<Store name="cde"/>
<Store name="fgh"/>
<Store name="ijklmn"/>
<Store name="opr"/>
</root>
желаемый, правильный результат получается :
17