Прежде всего: вы не можете использовать XPath, чтобы получить XML-документ "до чего-то". Вы можете использовать его для выбора узлов, вот и все. Если вы хотите изменить XML-документ, используйте XSLT.
Это выражение:
//item/name/parent::item
не выбирает «имя узла и его родителя», оно выбирает родительские узлы <name>
узлов и ничего больше.
Строго говоря, он выбирает все узлы <item>
, которые являются родительскими для узла <name>
, который сам является потомком узла <item>
. Что эквивалентно использованию только "//item"
, когда вы думаете об этом.
Нет способа выбрать структуру узлов. Вы можете выбрать только список узлов - набор узлов. Затем вы можете пройти по этим узлам и выяснить их положение в документе, но сам набор узлов будет плоским.
Я думаю, вам нужно более подробно объяснить, что вы пытаетесь сделать. Я мог бы написать XSL-преобразование, которое выполняет то, что вы, похоже, намерены, но если я не уверен, что вы намерены ...; -)
EDIT:
Вот один минималистичный подход XSLT 1.0, который бы это сделал.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="root | item | name | timestamp">
<xsl:copy>
<xsl:apply-templates select="*" />
<xsl:if test="count(*) = 0">
<xsl:value-of select="text()" />
</xsl:if>
</xsl:copy>
</xsl:template>
<xsl:template match="* | text()" />
</xsl:stylesheet>
Выход для вашего образца (шахта с отступами):
<root>e
<item>
<name>item name</name>
<timestamp>47398743598</timestamp>
</item>
<item>
...
</item>
</root>