Аттрибуты в XSLT

rudik

Developer
Аттрибуты в XSLT

Нижеприведенный шаблон должен вывести:
-------
Высота : 100
Ширина : 200
Глубина : 300
-------
PHP:
<?xml version="1.0" encoding="Windows-1251"?> 
<root> 

<style>
	<stl name="height">Высота</stl>
	<stl name="width">Ширина</stl>
	<stl name="depth">Глубина</stl>
</style>

<data>
	<function name="height">100</function>
	<function name="width">200</function>
	<function name="depth">300</function>
</data>
</root>

<?xml version="1.0" encoding="windows-1251"?> 
<!DOCTYPE xsl:stylesheet> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="html" indent="yes" encoding="Windows-1251"/> 

<xsl:key name="uid" match="function" use="@name"/>

<xsl:template match="stl">
<br />
	<xsl:value-of select="current()"/> :
	<xsl:for-each select="key('uid', '/style/stl/@name')">
		<xsl:value-of select="."/>
	</xsl:for-each>
</xsl:template>

</xsl:stylesheet>
Проблема заключается в конструкции <xsl:for-each select="key('uid', '/style/stl/@name')">, так если вместо /style/stl/@name поставить height, то выведет напротив Высота, Ширина, Глубина - 100. А необходимо для каждого элемента делать вывод соответствующего значения.[РАЗМЕРОМ=1]
 

rudik

Developer
Принимаются варианты с измененной структурой как XSLT так и XML.
 

Flying

Guest
Что-то типа этого:

PHP:
<xsl:template match="style">
  <xsl:for-each select="stl">
    <xsl:value-of select="text()"><xsl:text> : </xsl:text><xsl:value-of select="/root/data/function[@name=current()/@name]"/><br/> 
  </xsl:for-each>
</xsl:template>
 

rudik

Developer
Flying, если не тяжело объясни конструкцию [@name=current()/@name]"/
 

Flying

Guest
Она означает: элемент (в данном случае - нода с именем "function") у которой аттрибут name (здесь - @name) имеет такое же значение, как и аттрибут name у текущего контекстного элемента (current()/@name).

Контекстный элемент в данном случае - тот, который в данный момент выбран через <xsl:for-each>
 

rudik

Developer
Спасибо. Сложность была в понимании current()/@name, теперь я понял что это путь к ноде и ее аттрибут.
 
Сверху