Во-первых, есть несколько небольших проблем с вашим входным XML: узлы <id>
в <AmountList>
не закрыты должным образом, и у вас отсутствует закрывающий тег для корневого узла <myData>
.
Исправив это, вот мое предложение:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/myData">
<ClientList>
<xsl:for-each select="ClientList/Client">
<Client>
<surname>
<xsl:value-of select="surname" />
</surname>
<amount>
<xsl:value-of select="/myData/AmountList/Client[id=current()/id]/amount" />
</amount>
</Client>
</xsl:for-each>
</ClientList>
</xsl:template>
</xsl:stylesheet>
Выражение xPath /myData/AmountList/Client[id=current()/id]/amount
означает следующее:
Начиная с корня, найдите узел /myData/AmoutList/Client
, чей id
дочерний узел равен id
дочерний узел текущего контекстного узла , а затем выберите amount
дочерний узел этого узла.
Функция current()
является ключом, чтобы иметь возможность выполнять поиск подобным образом, когда вы ищете в другом месте дерева ввода какой-то узел на основе значения относительно узла, на котором вы находитесь в данный момент.
В этом случае текущий контекстный узел , возвращаемый current()
, является Client
узлом, потому что это то, что выбрано for-each
. Я считаю хорошей практикой всегда знать, какой ваш текущий контекстный узел находится в любой точке преобразования XSL.