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


Автор: neokortex 20.6.2011, 01:47
Есть XML:

Код

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <t m="one">One</t>
    <t m="two">Two</t>
    <t m="three">Three</t>
    <t m="four">Four</t>
    <t m="five">Five</t>
    <elements>
        <element id="1">
            <et n="65"> Element One - 65</et>
            <et n="69"> Element One - 69 </et>
        </element>
        <element id="3">
            <et n="37">Element Three - 37</et>
        </element>
        <element id="2">
            <et n="66">Element Two - 66</et>
        </element>
    </elements>
</root>

И есть такой XSLT:

Код

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
    <xsl:template match="/">
        <xsl:value-of select="//t[@m='three']" /> <!-- это преобразование работает -->
        <br /><br /><br /><br /><br /><br />
        <!-- преобразование ниже НЕ работает  :( -->
        <xsl:for-each select="//elements/element[@id='1']">
            <xsl:sort order="ascending" />
            <xsl:value-of select="et" />
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>


В результате - "Element One - 65" мне показывет, а "Element One - 69" - нет. 

Помогите, пожалуйста, разобраться.

Автор: diadiavova 20.6.2011, 08:24
Проблема в строке
Код

<xsl:value-of select="et" />

Дело в том, что et возвращет коллекцию элементов(как ты и ожидаешь), но value-of ожидает выражение, возвращающее один узел, в результате происхдит неявное приведение типов, а в xslt, когда тип коллекции узлов приводится к типу узла, то берется только первый узел коллекции. В то же время выражение //elements/element[@id='1'] возвращает коллекцию из одного единственного узла, вот ты и получаешь перового потомка этого узла с именем et. Если я правильно понял, что ты хочешь сделать, то это должно выглядеть как-то так
Код

        <xsl:for-each select="//elements/element[@id='1']/et">
            <xsl:value-of select="." />
        </xsl:for-each>

Автор: neokortex 20.6.2011, 16:15
Спасибо вам большое.

Что бы можно было почитать такого по XSLT, чтобы разбираться в подобных вопросах? 

Автор: diadiavova 20.6.2011, 18:25
Цитата(neokortex @  20.6.2011,  17:15 Найти цитируемый пост)
Что бы можно было почитать такого по XSLT, чтобы разбираться в подобных вопросах?

Тут, честно говоря, не подскажу. У меня это как-то само собой получилось и постепенно. Ну, еще помогает решение конкретных задач, в том числе, когда на форуме задают вопросы, то их решение тоже дает определенный опыт. Литературы много, но что лучше user posted image

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