XPath является (только) языком запросов для документов XML - результат оценки выражения XPath никогда не является измененным узлом - только XPath не меняет структуру и / или содержимое любого узел.
То, что вы хотите вернуть - это модифицированные <employee>
элементы только с их дочерним элементом <jobs>
, и это невозможно сделать только с помощью XPath.
Ближайшим к тому, что вы хотите, является :
/*/employee[name='John']/jobs
Выбирает следующее :
<jobs>
<job>Writer</job>
<job>Artist</job>
</jobs>
<jobs>
<job>Engineer</job>
<job>Editor</job>
</jobs>
Я полагаю, что с помощью этого преобразования XSLT вы можете добиться желаемого результата совершенно просто :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/employee[name='John']/node()[not(self::comment())]"/>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к предоставленному документу XML :
<employees>
<employee>
<!--forgot to include an attribute-->
<name>John</name>
<jobs>
<job>Writer</job>
<job>Artist</job>
</jobs>
</employee>
<employee>
<name>John</name>
<jobs>
<job>Engineer</job>
<job>Editor</job>
</jobs>
</employee>
</employees>
желаемый, правильный результат выдается :
<name>John</name>
<jobs>
<job>Writer</job>
<job>Artist</job>
</jobs>
<name>John</name>
<jobs>
<job>Engineer</job>
<job>Editor</job>
</jobs>