Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > Нужна помощь


Автор: t77 11.5.2010, 19:05
Доброе время суток.
После долгих и мучительных попыток, не получается у меня сделать... smile 
Уважаемые коллеги и знатоки XPATH, помогите пожалуйста смастерить запрос...
Имеется хмл следующей структуры:
Код

<QUERY>
    <INFO>
        <ITEM>
            <ELEMENT id="1" sigmaId="25">
                <EXT_LINK>
                    <PARAM name="name" value="111"></PARAM>                    
                </EXT_LINK>
            </ELEMENT>
            <ELEMENT id="2" sigmaId="50">
                <BOOK>
                    <PARAM name="name" value="222"></PARAM>                    
                </BOOK>
            </ELEMENT>
            <ELEMENT id="2" sigmaId="25">
                <LESSON>
                    <PARAM name="name" value="333"></PARAM>                    
                </LESSON>
            </ELEMENT>
            <ELEMENT id="2" sigmaId="25">
                <CHAPTER>
                    <PARAM name="name" value="444"></PARAM>                    
                </CHAPTER>
            </ELEMENT>
        </ITEM>
    </INFO>
</QUERY>

Мне необходимо найти все те элементы, у которых атрибут "sigmaId" равен 25 и получить имя или название нода потомка. 
Тоесть если исходить из вышеприведенного мною примера я должен получить:
EXT_LINK и LESSON.
Я здесь пробовал разные варианты, но увы ничего не получается.
Код

<xsl:variable name="currentInfoPath" select="/QUERY/INFO/ITEM" />


    <xsl:for-each select="$currentInfoPath/ELEMENT[@sigmaId = '25']">        
        <!--Пытаюсь получить имя первого нода-->
        <xsl:variable name="firstChildNodeName">
            <xsl:value-of select="//name()"/>            
        </xsl:variable>
        <xsl:choose>
            <xsl:when test="$firstChildNodeName ='EXT_LINK'">
                <!--Сделать определенные действия 1-->
            </xsl:when>
            <xsl:otherwise>
                <!--Сделать определенные действия 2-->
            </xsl:otherwise>
        </xsl:choose>        
    </xsl:for-each>

Я понимаю в строке:
"<xsl:value-of select="//name()"/>" есть синтаксическая ошибка!
Как это сделать правильно ?






Автор: t77 11.5.2010, 20:30
Судя по тому, что никто не отвечает можно сделать следующие выводы:
Или никто не знает как это сделать, в чем я сомневаюсь...
Или же я не понятно описал свой вопрос...
Так как склоняюсь больше ко второму варианту, опишу вопрос немного иначе.
И так, структура ХМЛ остается той же что я приводил выше.
Основываясь на ней, я прохожусь по всем элементам(ITEM/ELEMENT) и выполняю определенные действия.
При этом мне необходимо знать каждый раз если у данного элемента(ELEMENT) есть дочерний нод по имени EXT_LINK, если да, то сделать совсем другие рассчеты.
Петля(for-each) сориентированна на прохождении по нодам -ELEMENT.
Код

xsl:for-each select="$currentInfoPath/ELEMENT[@sigmaId = '25']

Мне необходимо поймать тот момент, когда у моего элемента(ELEMENT) имеется дочерний нод по имени- EXT_LINK
И так вопрос, как мне получать каждый раз в петле имя дочернего нода в виде стринга?
Заранее благодарю

Автор: diadiavova 11.5.2010, 21:27
Цитата(t77 @  11.5.2010,  20:05 Найти цитируемый пост)
Мне необходимо найти все те элементы, у которых атрибут "sigmaId" равен 25 и получить имя или название нода потомка. 

Попробуй что-то в этом роде
Код

<xsl:for-each select="//*[@sigmaid = '25']/*[1]">
    <xsl:value-of select="name()" /><br />
</xsl:for-each>

Цитата(t77 @  11.5.2010,  21:30 Найти цитируемый пост)
Судя по тому, что никто не отвечает

Ну имей терпение ёмаё, иногда люди и несколько дней ждут.

Да и ещё
Модератор: Название темы должно отражать ее суть!

Автор: t77 13.5.2010, 10:06
Спасибо, diadiavova. smile 

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