Проблема в том, что как только вы делаете xsl:for-each select="../../Items/Item"
, вы попадаете в другой контекст, и ваш предыдущий контекст (пакета) фактически «забывается».
Что вы можете сделать, это сохранить текущий идентификатор пакета в переменной перед выбором элементов и использовать его в compate
<Items>
<xsl:variable name="packageId" select="ID" />
<xsl:for-each select="../../Items/Item">
<xsl:if test="PackageID = $packageId">
<Item>
<PackageID><xsl:value-of select="PackageID"/></PackageID>
<Partnumber><xsl:value-of select="Partnumber"/></Partnumber>
<Quantity><xsl:value-of select="Quantity"/></Quantity>
</Item>
</xsl:if>
</xsl:for-each>
</Items>
Фактически вы можете поместить свое условие в выборку.xsl:for-each
вместо xsl:if
<xsl:variable name="packageId" select="ID" />
<xsl:for-each select="../../Items/Item[PackageID = $packageId]">
В этом случае это условие может ссылаться на текущий узел пакета, с current()
<xsl:for-each select="../../Items/Item[PackageID = current()/ID]">
Но сказавчто, может быть, даже лучше использовать xsl:key
здесь.Определите ключ как этот (как ребенок xsl:stylesheet
)
<xsl:key name="items" match="Item" use="PackageID" />
Тогда вы можете сделать это ...
<xsl:for-each select="key('items', ID)">
На самом деле, вам даже не нужноxsl:for-each
здесь вообще.Используйте xsl:apply-templates
и воспользуйтесь шаблоном идентификации.
Попробуйте этот упрощенный XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:key name="items" match="Item" use="PackageID" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Items" />
<xsl:template match="Package">
<Package>
<xsl:apply-templates />
<Items>
<xsl:apply-templates select="key('items', ID)" />
</Items>
</Package>
</xsl:template>
</xsl:stylesheet>