Следующее выражение XPath 2.0 :
//file/concat(string-join(ancestor::*[parent::*]
/concat(name(.), '/'),
''),
@name, '
'
)
при сравнении с предоставленным документом XML :
<xml>
<home>
<mysite>
<www>
<images>
<file name="logo.gif"/>
</images>
<file name="index.html"/>
<file name="about_us.html"/>
</www>
</mysite>
</home>
</xml>
выдает искомый правильный результат :
home/mysite/www/images/logo.gif
home/mysite/www/index.html
home/mysite/www/about_us.html
Если вы не можете использовать XPath 2.0, вы не сможете получить искомый результат только с выражением XPath 1.0 .
Затем для получения результата необходимо использовать язык программирования, на котором размещается XPath (например, XSLT, C #, php, ...).
Вот решение XSLT 1.0:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="file">
<xsl:for-each select="ancestor::*[parent::*]">
<xsl:value-of select="concat(name(),'/')"/>
</xsl:for-each>
<xsl:value-of select="concat(@name, '
')"/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
когда это преобразование применяется к тому же XML-документу, получается тот же правильный результат :
home/mysite/www/images/logo.gif
home/mysite/www/index.html
home/mysite/www/about_us.html