<?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
<xsl:template match="/shop">
<xsl:for-each select="shop/item">
<xsl:sort select="item/modifications/item[not(@id < preceding-sibling::item/modifications/item/@id) and not(@id < following-sibling::item/modifications/item/@id)]/@id | @id" order="descending" />
</xsl:for-each >
</xsl:template>
<xsl:template match="item">
<xsl:apply-templates select="item"/>
это ошибкаприсутствуют обе части выражения одновременно, и как тогда срабатывает sort?
так я уже голову сломаютут нужно вставить условие, которое выберет большее из этих частей! и тогда будет работать, согласен?
спасибо тебе за твою доброту! )это ошибка
попробуй добавить во 2ю [not(modification)]
не понимаю о каких id разговор,
либо есть modification
./modification/item/@datetime
либо нет .[not(modification)]/@datetime
<xsl:sort select="item/modifications/item[not(@id < preceding-sibling::item/@id) and not(@id < following-sibling::item/@id)]/@id | item[not(modifications)]/@id" order="descending" />
item/modifications/item[not(@id < preceding-sibling::item/@id) and not(@id < following-sibling::item/@id)]/@id
<?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
<xsl:template match="/">
<xsl:for-each select="root/item">
а то что в XML есть ошибка, это поменяет решение?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>
а как это понимать сортировка поКод:<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"/>
нет это просто моя точка входа!неужели сортировку в корне нужно проводить?
ты не написал валидный xml я его допридумывал обернув все <root> root/item от точки входа через root все itemчто имеется ввиду под "root/item"
не понял вопроса, но для sort нужно одно значение которое можно определить на свое место, согласись, 2 значения сложнееа то что в XML есть ошибка, это поменяет решение?
мне это не нужно было!а где же apply-template select="item"?