Выражение пути, которое вы говорите, работает для вас
//books[1]/*
создает список всех дочерних узлов первого (и только в этом случае) вхождения любого узла . Поскольку, по вашим данным, единственное вхождение находится в корне, оно совпадает с
/books/*
, который возвращает два узла, и поэтому вы ошибаетесь, говоря, что он возвращает только один узел.
Трудно понять, что вам нужно, так как если вы всегда применяете local-name
к корневому узлу, вам не нужно знать его имя и вы можете получить к нему доступ только с помощью /*
, так что вы захотите просто
/*/*[1]
Однако, чтобы получить доступ к первому дочернему узлу узла в любом месте документа, вы должны написать
//*[local-name()='books']/*[1]
Вы должны быть осторожны, чтобы как можно больше ограничить свой контекст, так как запуск выражения XPath с //
заставит искать весь документ, что бессмысленно и занимает много времени, если рассматриваемый узел всегда находится на корень.