Сортировка по материнскому и дочернему атрибуту

WMix

герр M:)ller
Партнер клуба
может всеже OR ?
в зависимости от контента можно воспринять по разному
это ИЛИ это вернет это И это
 

Валерьян

Новичок
спасибо тебе сердечное)
а если в выражении
modifications/item[last()]/@datetime
нужно не просто last(), а самый "свежий", или последний datetime, потому что XML по datetime не отсортирован, и last() - не соответствует самому последнему datetime?
 

Redjik

Джедай-мастер
WMix, сорри за оффтоп, но увидел google.de и вспомнил, все хотел спросить:
какая у тебя клавиатура и раскладки... или у тебя рус и анго и ты умлауты в ue пишешь?
 

WMix

герр M:)ller
Партнер клуба
Redjik, немцы и русские, google.de думаю из-за языка в браузере выкидывает.
Валерьян, ну сделай через дерево

Код:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="sort.xsl" ?>
<root>
    <item datetime="2012-12-12 12:12:14" val="01" />
    <item datetime="2012-12-12 12:12:22" val="02" />
    <item val="03">
        <modifications>
            <item datetime="2012-12-12 12:12:12" />
            <item datetime="2012-12-12 12:12:15" />
            <item datetime="2012-12-12 12:12:13" />
        </modifications>
    </item>
    <item datetime="2012-12-12 12:12:11" val="04" />
</root>

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="text"/>

    <xsl:variable name="items">
        <root>
            <xsl:for-each select="root/item">
                <item>
                    <xsl:attribute name="val">
                        <xsl:value-of select="@val" />
                    </xsl:attribute>
                    <xsl:choose>
                        <xsl:when test="modifications">
                            <xsl:for-each select="modifications/item">
                                <xsl:sort select="./@datetime" order="descending"/>
                                <xsl:if test="position() = 1">
                                    <xsl:attribute name="datetime">
                                        <xsl:value-of select="./@datetime"/>
                                    </xsl:attribute>
                                </xsl:if>
                            </xsl:for-each>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:attribute name="datetime">
                                <xsl:value-of select="@datetime"/>
                            </xsl:attribute>
                        </xsl:otherwise>
                    </xsl:choose>
                </item>
            </xsl:for-each>
        </root>
    </xsl:variable>

    <xsl:template match="/">
        <xsl:copy-of select="$items"/>
        <xsl:for-each select="$items/descendant::*">
            <xsl:sort select="@datetime" order="descending"/>
                <xsl:value-of select="@datetime"/> <xsl:value-of select="@val"/>
                <xsl:text>
</xsl:text>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>


java -jar saxon9he.jar -s:1.xml -xsl:sort.xsl
2012-12-12 12:12:2202
2012-12-12 12:12:1503
2012-12-12 12:12:1401
2012-12-12 12:12:1104
 

Валерьян

Новичок
я уже твой метод присобачил, он самый лучший ) пробую пока через @ID, если решу с @ID, тогда с таймом легче будет!
Код:
<xsl:template match="/shop">
<xsl:for-each select="shop/item">
  <xsl:sort select="item/modifications/item[not(@id &lt; preceding-sibling::item/modifications/item/@id) and not(@id &lt; following-sibling::item/modifications/item/@id)]/@id | @id" order="descending" />
</xsl:for-each >
</xsl:template>
и максимальный @ID выбирается, но не сортирует! товары остаются на своих местах ((
что-то в этой конструкции не так, можешь объяснить, почему цикл нужен в корневом шаблоне а не в самом
Код:
<xsl:template match="item">
?
или не для
Код:
<xsl:apply-templates select="item"/>
?
 

Валерьян

Новичок
наверное потому что, в
PHP:
select="modifications/item[last()]/@datetime|@datetime" order="descending"/>
присутствуют обе части выражения одновременно, и как тогда срабатывает sort?
игнорирует?
 

Валерьян

Новичок
тут нужно вставить условие, которое выберет большее из этих частей! и тогда будет работать, согласен?
 

Валерьян

Новичок
это ошибка
попробуй добавить во 2ю [not(modification)]
спасибо тебе за твою доброту! )
но посмотри логически, это же не меняет сути, выражение для некоторых item не выбирает конкретный id, слева выбирается максимальный id и справа выбирается id, т.е. для некоторых item выбирается сразу два id, как sort будет сортировать?
прописал и результат = нет сортировки
 

WMix

герр M:)ller
Партнер клуба
не понимаю о каких id разговор,
либо есть modification
./modification/item/@datetime
либо нет .[not(modification)]/@datetime
 

AnrDaemon

Продвинутый новичок
Redjik, немцы и русские, google.de думаю из-за языка в браузере выкидывает.
У меня en>ru выставлено, но если прямо ввести "google.com", редиректит на .ru.
Если искать через макрос (g!c/?q=%s), то не редиректит, так и остаётся .com.
 

Валерьян

Новичок
не понимаю о каких id разговор,
либо есть modification
./modification/item/@datetime
либо нет .[not(modification)]/@datetime
Код:
<xsl:sort select="item/modifications/item[not(@id &lt; preceding-sibling::item/@id) and not(@id &lt; following-sibling::item/@id)]/@id | item[not(modifications)]/@id" order="descending" />
не сортирует ((, ведь слева
Код:
item/modifications/item[not(@id &lt; preceding-sibling::item/@id) and not(@id &lt; following-sibling::item/@id)]/@id
прекрасно выбирает максимальное число!
ну что не так?
 

Валерьян

Новичок
sort.xsl
PHP:
<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="text"/>

    <xsl:template match="/">
        <xsl:for-each select="root/item">
            <xsl:sort select="modifications/item[last()]/@datetime|@datetime" order="descending"/>
            <xsl:value-of select="@val"/>
        </xsl:for-each >
    </xsl:template>

</xsl:styleshe
неужели сортировку в корне нужно проводить?
PHP:
<xsl:template match="/">
        <xsl:for-each select="root/item">
что имеется ввиду под "root/item"
 

Валерьян

Новичок
Redjik, немцы и русские, google.de думаю из-за языка в браузере выкидывает.
Валерьян, ну сделай через дерево

Код:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="sort.xsl" ?>
<root>
    <item datetime="2012-12-12 12:12:14" val="01" />
    <item datetime="2012-12-12 12:12:22" val="02" />
    <item val="03">
        <modifications>
            <item datetime="2012-12-12 12:12:12" />
            <item datetime="2012-12-12 12:12:15" />
            <item datetime="2012-12-12 12:12:13" />
        </modifications>
    </item>
    <item datetime="2012-12-12 12:12:11" val="04" />
</root>

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="text"/>

    <xsl:variable name="items">
        <root>
            <xsl:for-each select="root/item">
                <item>
                    <xsl:attribute name="val">
                        <xsl:value-of select="@val" />
                    </xsl:attribute>
                    <xsl:choose>
                        <xsl:when test="modifications">
                            <xsl:for-each select="modifications/item">
                                <xsl:sort select="./@datetime" order="descending"/>
                                <xsl:if test="position() = 1">
                                    <xsl:attribute name="datetime">
                                        <xsl:value-of select="./@datetime"/>
                                    </xsl:attribute>
                                </xsl:if>
                            </xsl:for-each>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:attribute name="datetime">
                                <xsl:value-of select="@datetime"/>
                            </xsl:attribute>
                        </xsl:otherwise>
                    </xsl:choose>
                </item>
            </xsl:for-each>
        </root>
    </xsl:variable>

    <xsl:template match="/">
        <xsl:copy-of select="$items"/>
        <xsl:for-each select="$items/descendant::*">
            <xsl:sort select="@datetime" order="descending"/>
                <xsl:value-of select="@datetime"/> <xsl:value-of select="@val"/>
                <xsl:text>
</xsl:text>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>
а то что в XML есть ошибка, это поменяет решение?
у всех item есть datetime, но это не @атрибут, а дочерний элемент item/datetime
 
Последнее редактирование:

Валерьян

Новичок
Код:
 <xsl:template match="/">
        <xsl:copy-of select="$items"/>
        <xsl:for-each select="$items/descendant::*">
            <xsl:sort select="@datetime" order="descending"/>
                <xsl:value-of select="@datetime"/> <xsl:value-of select="@val"/>
                <xsl:text>
</xsl:text>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>
а как это понимать сортировка по
Код:
<xsl:value-of select="@datetime"/> <xsl:value-of select="@val"/>
а где же apply-template select="item"?

хотел xml тебе отправить, так zip = 13кб, не пропускает
 

WMix

герр M:)ller
Партнер клуба
ой ой ой.. еще не справился? прочти книжку уже..
неужели сортировку в корне нужно проводить?
нет это просто моя точка входа!
что имеется ввиду под "root/item"
ты не написал валидный xml я его допридумывал обернув все <root> root/item от точки входа через root все item
а то что в XML есть ошибка, это поменяет решение?
не понял вопроса, но для sort нужно одно значение которое можно определить на свое место, согласись, 2 значения сложнее ;)
а где же apply-template select="item"?
мне это не нужно было!
 
Сверху