Всем привет
Есть небольшая проблемка.
Это фрагмент исходного файла:
<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XML Spy v4.3 U (http://www.xmlspy.com) by John Carpenter (PDMS - Projects) -->
<content stylesheet="attributevalues.xsl" username="Permanent User" userid="122" information="">
<userattributegroups count="5">
<userattributegroup id="2">
<groupsequence>2</groupsequence>
<description>Travel</description>
<userattributes count="7">
<attribute id="9" attributevalueid="0">
<name>country</name>
<description>Country</description>
<maxlength>50</maxlength>
<sequence>7</sequence>
<editable>no</editable>
<storageclass>C</storageclass>
<userattributetypedescription>lookup</userattributetypedescription>
<charvalue/>
<memovalue/>
</attribute>
</userattributes>
</userattributegroup>
</userattributegroups>
<lookup count="2" name="country" codepresent="no" editable="yes" organisationpresent="no" descriptionlength="50">
<element id="3" description="Afghanistan"/>
<element id="6" description="Albania"/>
</lookup>
</content>
Это фрагмент шаблона:
<select name="attr{@id}" size="1">
<xsl:if test="editable='no' and charvalue!=''">
<xsl:attribute name="disabled">true</xsl:attribute>
</xsl:if>
<option value="">
Not specified
</option>
<xsl:for-each select="//lookup[@name='country']/element">
<xsl:sort select="@description"/>
<option>
<xsl:if test="charvalue=@description">
<xsl:attribute name="selected"/>
</xsl:if>
<xsl:attribute name="value">
<xsl:value-of select="@description"/>
</xsl:attribute>
<xsl:value-of select="@description"/>
</option>
</xsl:for-each>
</select>
В результате получается комбобокс со списком, в данном случае стран.
Как можно в шаблоне вместо конкретного имени лукапа подставить значение поля. Соответствующие места выделены.
Здравствуйте Aeneas, Вы писали:
A>Как можно в шаблоне вместо конкретного имени лукапа подставить значение поля. Соответствующие места выделены.
Если в XML будет только один узел
name, то это делается так:
<xsl:for-each select="//lookup[@name=//name]/element">
Здравствуйте Zerg, Вы писали:
Z>Если в XML будет только один узел name, то это делается так:
Z><xsl:for-each select="//lookup[@name=//name]/element">
Извиняюсь, забыл сказать, что тегов attribute много и лукапов в общем случае может быть несколько.
В момент отработки приведенного фрагмента шаблона мы находимся внутри одного из тегов attribute.
Естественно нужно подставить значение элемента name именно из текущего тега attribute
Здравствуйте Aeneas, Вы писали:
A>Извиняюсь, забыл сказать, что тегов attribute много и лукапов в общем случае может быть несколько.
A>В момент отработки приведенного фрагмента шаблона мы находимся внутри одного из тегов attribute.
A>Естественно нужно подставить значение элемента name именно из текущего тега attribute
Если я правилино понял, то XML будет подобен следующему:
<?xml version="1.0" encoding="UTF-8"?>
<content stylesheet="attributevalues.xsl" username="Permanent User" userid="122" information="">
<userattributegroups count="5">
<userattributegroup id="2">
<groupsequence>2</groupsequence>
<description>Travel</description>
<userattributes count="7">
<attribute id="9" attributevalueid="0">
<name>country</name>
<description>Country</description>
<maxlength>50</maxlength>
<sequence>7</sequence>
<editable>no</editable>
<storageclass>C</storageclass>
<userattributetypedescription>lookup</userattributetypedescription>
<charvalue/>
<memovalue/>
</attribute>
<attribute id="9" attributevalueid="0">
<name>country2</name>
<description>Country</description>
<maxlength>50</maxlength>
<sequence>7</sequence>
<editable>no</editable>
<storageclass>C</storageclass>
<userattributetypedescription>lookup</userattributetypedescription>
<charvalue/>
<memovalue/>
</attribute>
</userattributes>
</userattributegroup>
</userattributegroups>
<lookup count="2" name="country" codepresent="no" editable="yes" or-ganisationpresent="no" descriptionlength="50">
<element id="3" description="Afghanistan"/>
<element id="6" description="Albania"/>
</lookup>
<lookup count="2" name="country2" codepresent="no" editable="yes" or-ganisationpresent="no" descriptionlength="50">
<element id="3" description="Russia"/>
<element id="6" description="Ukraina"/>
</lookup> [/b]
</content>
тогда беря XSL такого вида:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<!-- для примера переберу все теги attribute -->
<xsl:for-each select="//attribute">
<select name="attr{@id}" size="1">
<xsl:if test="editable='no' and charvalue!=''"><xsl:attribute name="disabled">true</xsl:attribute></xsl:if>
<option value="">Not specified</option>
<xsl:variable name="Name" select="name"/>
<xsl:for-each select="//lookup[@name=$Name]/element">
<xsl:sort select="@description"/>
<option>
<xsl:if test="charvalue=@description"><xsl:attribute name="selected"/></xsl:if>
<xsl:attribute name="value"><xsl:value-of select="@description"/></xsl:attribute>
<xsl:value-of select="@description"/>
</option>
</xsl:for-each>
</select>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
получаем на выходе:
<select name="attr9" size="1">
<option value="">Not specified</option>
<option value="Afghanistan">Afghanistan</option>
<option value="Albania">Albania</option>
</select>
<select name="attr9" size="1"><option value="">Not specified</option>
<option value="Russia">Russia</option>
<option value="Ukraina">Ukraina</option>
</select>
Это то, что было необходимо?
Здравствуйте Zerg, Вы писали:
Z>Это то, что было необходимо?
Z>
Да, спасибо большое!
Я уже сам допер.