Я думаю, что моя проблема довольно распространена, поэтому должно быть простое решение. Рассмотрим следующий фрагмент XML:
<categories>
<category name="cat1" />
<category name="cat2" />
<category name="cat3" />
<category name="cat4" />
</categories>
<data>
<catval name="cat2">foo</catval>
<catval name="cat4">bar</catval>
<catval name="cat3">boo</catval>
</data>
Мне нужно вывести значения catval в порядке, определенном в элементе категорий (включая категории, у которых нет данных). Обратите внимание, что в реальном входном XML есть несколько элементов data повсюду, и вывод является более сложным, поэтому создание шаблона для категорий не представляется возможным. Я использую конструкцию, подобную следующей:
<xsl:template match="data">
<xsl:variable name="currentdata" select="." />
<xsl:for-each select="../categories/category">
<xsl:value-of select="@name" />:
<xsl:value-of
select="$currentdata/catval[@name=@name]" /> <!-- ??? -->
</xsl:for-each>
</xsl:template>
Я не знаю, является ли это лучшим подходом для решения моей проблемы, но даже если это не так: как сопоставить атрибут name в $ currentdata / catval с атрибут name элемента category в контексте цикла for-each?