Как подставить значение поля в XPath
От: Aeneas Россия  
Дата: 23.04.02 12:45
Оценка:
Всем привет
Есть небольшая проблемка.
Это фрагмент исходного файла:


<?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>


В результате получается комбобокс со списком, в данном случае стран.
Как можно в шаблоне вместо конкретного имени лукапа подставить значение поля. Соответствующие места выделены.
Re: Как подставить значение поля в XPath
От: Zerg Россия  
Дата: 23.04.02 13:06
Оценка:
Здравствуйте Aeneas, Вы писали:

A>Как можно в шаблоне вместо конкретного имени лукапа подставить значение поля. Соответствующие места выделены.


Если в XML будет только один узел name, то это делается так:

<xsl:for-each select="//lookup[@name=//name]/element">
Re[2]: Как подставить значение поля в XPath
От: Aeneas Россия  
Дата: 24.04.02 02:20
Оценка:
Здравствуйте Zerg, Вы писали:


Z>Если в XML будет только один узел name, то это делается так:


Z>
<xsl:for-each select="//lookup[@name=//name]/element">


Извиняюсь, забыл сказать, что тегов attribute много и лукапов в общем случае может быть несколько.
В момент отработки приведенного фрагмента шаблона мы находимся внутри одного из тегов attribute.
Естественно нужно подставить значение элемента name именно из текущего тега attribute
Re[3]: Как подставить значение поля в XPath
От: Zerg Россия  
Дата: 24.04.02 06:36
Оценка: 1 (1)
Здравствуйте 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>


Это то, что было необходимо?
Re[4]: Как подставить значение поля в XPath
От: Aeneas Россия  
Дата: 24.04.02 06:48
Оценка:
Здравствуйте Zerg, Вы писали:


Z>Это то, что было необходимо?

Z>

Да, спасибо большое!
Я уже сам допер.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.