Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > Err: Variable pIndex5 has not declared


Автор: Iren21 16.4.2013, 10:19

Хочу в условии(<xsl:if test="$pIndex5 = 5"/>) использовать определенную выше переменную 
(<xsl:variable name="pIndex5" select="5"/>), но выводит ошибку! 
Подскажите, как с этим справиться

Код


<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">    <!--5 7 21-->
        <xsl:text>
        </xsl:text>
        <xsl:for-each select="Table/Row">
            <xsl:for-each select="Cell">
                <xsl:variable name="pIndex" select="@Index"/>                 
                                            
                <xsl:variable name="pIndex7"/>
                
                <xsl:if test="$pIndex = 5">
                    <xsl:variable name="pIndex5" select="5"/>
                    <xsl:variable name="pData5" select="Data"/>
                </xsl:if>
                <xsl:if test="$pIndex = 7">
                    <xsl:if test="$pIndex5 = 5"/> <!--Ошибка в этой строке-->
                        <xsl:variable name="pData7" select="Data"/>
                    </xsl:if>
                </xsl:if>
            </xsl:for-each>           
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>     

Автор: diadiavova 16.4.2013, 10:48
Все дело в области видимости:  пиндекс5 объявлена в блоке иф, стало быть там и нужно её использовать, а за пределами этого блока она не видна.

Автор: Iren21 16.4.2013, 11:09
По сути проблема такая:
Идем по Row, если пройдя цикл Index встретился со значениями 3,5,21 (должны присутствовать все значения), то запоминает значения в теге <Data>наше значение</Data> и потом выводим их


Код

<Row>
    <Cell Index="3" StyleID="21"><Data Type="String">245</Data></Cell>
    <Cell Index="5" StyleID="21"><Data Type="String">Занько Никита Георгиевич</Data></Cell>
    <Cell Index="7" StyleID="21"><Data Type="String">06.10.1979</Data></Cell>
    <Cell StyleID="21"><Data Type="String">гор. Ленинград</Data></Cell>
    <Cell Index="10" StyleID="21"><Data Type="String">Мужской</Data></Cell>
    <Cell Index="12" StyleID="21"><Data Type="String">РОССИЯ</Data></Cell>
    <Cell Index="14" StyleID="21"><Data Type="String">Санкт-Петербург г,  Фрунзенский р-н, пр-кт Волковский, д. 8, кв 18</Data></Cell>
    <Cell Index="18" StyleID="21"><Data Type="String">Паспорт гражданина Российской Федерации</Data></Cell>
    <Cell Index="21" StyleID="21"><Data Type="String">4012 579103</Data></Cell>
   </Row>

Автор: diadiavova 16.4.2013, 11:38
Так в чём затруднение? Отобрать строки, в которых присутствуют все эти индексы? 

Автор: Iren21 16.4.2013, 11:51
Так проблема как раз в переопределении переменной! Нужно собрать данные в строках с индексами 3, 5, 21, но только при условии, если эти 3 строки встретилсь в коде, если их нет, то ничего не делать. 
Хотел сделать так: объявить пустые переменные, и если в коде встречаем нужный индекс, то в переменную идет запись, после онализируем, все ли переменные заполнены и если да, то выводим собранный результат. Но проблема в том, что переопределить описанную переменную не получается. Других вариантов как это сделать - не знаю!
Если есть возможность выцепить нужные значения - покажи плиз, как это сделать!

Автор: diadiavova 16.4.2013, 12:46
Во-первых, забудь о переменных, циклах и прочей лабуде, поскольку это функциональный язык и здесь ничего этого не( даже не смотря на имена элементов типа variable). Во-торых, ты так и не сырмулировал точно суть пооблемы. Насколько я понял, заключается проблема именно в отборе строк, в которых присутствуют все три индекса. Делается это путём задания более точного критерия отбора строк, то есть надо использовать фильтр по строкам. Вместо 
Код

//Table/Row
Надо писать что-то типа
Код

//Table/Row[Cell[@Index = '3'] and Cell[@Index = '5'] and Cell[@Index = '21'] ]
Код не проверял, но идея должна быть понятна.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)