я не знаю имени родителя и имени узла
Решение descendant::*[ @id= '1'
]/subelement
Использование descendant::*
может быть крайне неэффективным, поскольку это приводит к обходу полного поддерева, укорененного в текущем узле.
Вот эффективное решение XSLT :
Это преобразование:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:key name="kElByParentId" match="*" use="../@id"/>
<xsl:template match="/">
<xsl:copy-of select="key('kElByParentId', '1')"/>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному документу XML (исправлено, чтобы быть правильно сформированным):
<root>
<node>
<element id='1'>
<subelement>val</subelement>
</element>
<element id='2'>
<subelement>val</subelement>
</element>
</node>
</root>
производит искомый, правильный результат :
<subelement>val</subelement>
Примечание : Использование клавиш (<xsl:key>
и функция key()
) делает это действительно эффективным решением - с сублинейным(даже близко к постоянному) сложность времени.