Я думаю, что вы хотите изменить
for $productos in collection("/ventas")/productos
let $nombre := $productos/product[codigo=$codigos/codigo]/nombre,
$pvp := $productos/product[codigo=$codigos/codigo]/@pvp
до
for $producto in collection("/ventas")/productos/product[codigo=$codigos/codigo]
let $nombre := $producto/nombre,
$pvp := $producto/@pvp
Что касается дальнейших проблем, поднятых в комментарии, ну, вы не показали свою структуру ввода, и я думаю, что вы пытаетесь решить различные проблемы одним вопросом. Теперь у вас есть правильное количество detalle
элементов с правильными nombre
дочерними данными и правильным pvp
значением?
Для правильности codigo
я думаю, что вам лучше использовать
for $p1 in collection("/ventas")/productos/product,
$p2 in collection("/ventas")/detallefacturas/factura[@numero="100"]/producto where $p1/codigo = $p2/codigo
let $nombre := $producto/nombre,
$pvp := $producto/@pvp
return
<detalle>
<codigo>{data($p2/codigo)}</codigo>
<nombre>{data($nombre)}</nombre>
<cant>{data($p2/unidades)}</cant>
<pvp>{data($pvp)}</pvp>
<importe></importe>
</detalle>
Это может помочь отредактировать ваш вопрос с образцами данных или задать новый вопрос с образцами данных по этой проблеме.