powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Можно ли отсортировать в конструкции for-each в динамическом порядке.
25 сообщений из 82, страница 3 из 4
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34434334
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FixinЯ привел пример примитивнейшей задачи, для которой нет решения в языке, хотя механизмы для этого все есть в языке . Т.е. это упущение языка.
То есть практически ты сказал. Это сделать можно, токо меня ломает, а вы додуматься не в состоянии как это сделать.
Fixin
Можно конечно написать свой аналог xlst:sort (например пузырьковую сортировку), но тогда зачем штатный механизм сортировки нужен.
штатный механизм сортировки нужен для тех кто так не извращается и писать ему в лом.
З.Ы. перенеси вопрос в новый топик, а то этот уже больно по трафику бъет. и вынеси уже те вопросы которые обсуждаются
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34435514
dimzon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SuSa dimzonНа самом деле есть следующие варианты решения:
1) Генерировать код сортировки в рантайме
2) Использовать вспомогательную логику через xsl-расширения (зависит от того каким XSL-процессором происходит преобразование)
да ну?! Если ты такой специалист, не мог бы ты приветси код по обоим пунктам своего возможного решения.
Очень охото посмотреть как можно осуществить "сортировкуи в рантайме" на xslt

Второй способ (первый способ тут)
Код: plaintext
<?xml version="1.0" encoding="windows-1251" ?>\n<xsl:stylesheet version="1.0" \n\txmlns:xsl="http://www.w3.org/1999/XSL/Transform"\n\txmlns:user="urn:это_нужно_для_блока_msxsl:script"\n\txmlns:msxsl="urn:schemas-microsoft-com:xslt"\n\texclude-result-prefixes="msxsl user"\n>\n\t<xsl:output encoding="windows-1251" method="html" version="4.0" />\n\n\t<msxsl:script language="VBScript" implements-prefix="user">\n\t<![CDATA[\n\t\'\' ВНИМАНИЕ! Вместо скрипта можно использовать объект-расширение\n\t\'\'\t\tдля MSXML см http://msdn2.microsoft.com/en-us/library/ms753807.aspx\n\t\'\'\t\tдля .NET см http://msdn2.microsoft.com/en-us/library/tf741884.aspx\n\t\'\'\t\tдля Java см http://xml.apache.org/xalan-j/extensions_xsltc.html\n\t\'\' дополнительно смотреть http://msdn2.microsoft.com/en-us/library/6datxzsd.aspx\n\toption explicit\n\t\n\t\'\'--------------------------------------------------------------------------\n\t\'\' функция выполняет динамическую сортировку и возвращает отсортированный node-list\n\tfunction doSort(oRowContainerNode, oSortByNodes)\n\t\tdim sOrderBy: sOrderBy = ""\n\t\tdim oNode\n\t\tFor Each oNode In oSortByNodes\n\t\t\tsOrderBy = sOrderBy & "<xsl:sort select=""" & oNode.SelectSingleNode("name").nodeTypedValue & """"\n\t\t\tIf "desc" = oNode.SelectSingleNode("order").nodeTypedValue Then\n\t\t\t\tsOrderBy = sOrderBy &  " order=""descending"""\n\t\t\tEnd If\n\t\t\tsOrderBy = sOrderBy & "/>"\n\t\tNext\n\t\n\t\tdim oXslt: Set oXslt = oRowContainerNode.item( 0 ).ownerDocument.cloneNode(false)\n\t\toXslt.async = false\n\t\toXslt.loadXml _\n\t\t\t"<?xml version=""1.0""?>" & vbNewLine & _ \n\t\t\t"<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">" & vbNewLine & _ \n\t\t\t"\t<xsl:template match=""*"">" & vbNewLine & _ \n\t\t\t"\t\t<root>" & vbNewLine & _ \n\t\t\t"\t\t\t<xsl:for-each select=""*"">" & vbNewLine & sOrderBy & _ \n\t\t\t"\t\t\t\t<xsl:copy-of select=""current()""/>" & vbNewLine & _ \n\t\t\t"\t\t\t</xsl:for-each>" & vbNewLine & _ \n\t\t\t"\t\t</root>" & vbNewLine & _ \n\t\t\t"\t</xsl:template>" & vbNewLine & _ \n\t\t\t"</xsl:stylesheet>"\n\t\tDim outputObject: Set outputObject = oXslt.cloneNode(false)\t\t\t\n\t\toRowContainerNode.item( 0 ).transformNodeToObject oXslt, outputObject\n\t\tSet doSort=outputObject.selectNodes("/root")\n\tend function\n\t]]>\n\t</msxsl:script>\n\n\n\t<xsl:template match="/">\n\t\t<html>\n\t\t\t<title>test2</title>\n\t\t\t<body>\n\t\t\t\t<table border="1">\n\t\t\t\t\t<tr bgcolor="#CCCCCC">\n\t\t\t\t\t\t<xsl:for-each select="root/info/fields/*">\n\t\t\t\t\t\t\t<td align="center">\n\t\t\t\t\t\t\t\t<strong>\n\t\t\t\t\t\t\t\t\t<xsl:value-of select="name"/>\n\t\t\t\t\t\t\t\t</strong>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</xsl:for-each>\n\t\t\t\t\t</tr>\n\t\t\t\t\t\n\t\t\t\t\t<xsl:variable name="fields" select="/root/info/fields"/>\n\t\t\t\t\t<xsl:for-each select="user:doSort(root/lines,root/info/orders/*)/*">\n\t\t\t\t\t\t<tr bgcolor="#FFEFF0">\n\t\t\t\t\t\t\t<xsl:if test="position() mod 2=0">\n\t\t\t\t\t\t\t\t<xsl:attribute name="bgcolor">#CCCCCC</xsl:attribute>\n\t\t\t\t\t\t\t</xsl:if>\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t<xsl:value-of select="local-name()"/>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<xsl:variable name="CurrLine" select="current()"/>\n\t\t\t\t\t\t\t<xsl:for-each select="$fields/*">\n\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t<xsl:value-of select="$CurrLine/*[local-name()=current()/name]"/>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</xsl:for-each>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</xsl:for-each>\n\t\t\t\t</table>\n\t\t\t</body>\t\n\t\t</html>\n\t</xsl:template>\n</xsl:stylesheet>

Ну что, вопрос исчерпан?
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34435557
Fixin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimzon ... Код с привлечением VBS ...
Хахаха, ты этим кодом еще раз доказал убогость XSLT.
XSLT, мощный язык работы с данными и сам не может выполнить банальную сортировку.
Голимое решение.
Проще было бы на XSLT бабл-сорт написать.
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34435602
dimzon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fixin dimzon ... Код с привлечением VBS ...
Хахаха, ты этим кодом еще раз доказал убогость XSLT.
XSLT, мощный язык работы с данными и сам не может выполнить банальную сортировку.
Во первых читай каммент по поводу использования extension-объектов.
SQL, мощнейший работы с данными тоже не может выполнить "банальную" сортировку сам. Причина в том что эта сортировка не банальна.

Fixin
Голимое решение.

Уж кто-бы говорил, особенно в свете последующего:
Fixin
Проще было бы на XSLT бабл-сорт написать.

Вот тут заявляю лично тебе 2 вещи :
А слабо взять и написать и с нами поделиться?
А даже если напишешь работать будет в РАЗЫ если не ДЕСЯТКИ раз медленнее моего решения, особенно на больших (100 и более строк) объемах
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34435610
dimzon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ладно, FIXIN, понтуешься ты много, надо посмотреть чего ты на практике стоишь

Итак ты утверждаешь что XSLT-кривой язык .
Если да то ДОКАЖИ это не просто найдя в XSLT изъян а приведи пример кода выполняющего те-же самые операции (такое-же преобразование из XML в HTML) на другом языке.
При этом мы сравним
a) Объем кода
b) Простоту сопровождения (насколько сложно внесение изменений в дизайн)
c) Читаемость
d) Производительность

Ты утверждаешь что показанные тебе решения твоей проблемы "голимые"
Если да то ДОКАЖИ это приведя другое РАБОТАЮЩЕЕ решение
При этом мы сравним
a) Объем кода
b) Простоту сопровождения (насколько сложно внесение изменений в дизайн)
c) Читаемость
d) Производительность

Ну что, принимаешь вызов или слабо?
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34435623
Fixin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimzonЛадно, FIXIN, понтуешься ты много, надо посмотреть чего ты на практике стоишь

Итак ты утверждаешь что XSLT-кривой язык .
Если да то ДОКАЖИ это не просто найдя в XSLT изъян а приведи пример кода выполняющего те-же самые операции (такое-же преобразование из XML в HTML) на другом языке.
При этом мы сравним
a) Объем кода
b) Простоту сопровождения (насколько сложно внесение изменений в дизайн)
c) Читаемость
d) Производительность

Ты утверждаешь что показанные тебе решения твоей проблемы "голимые"
Если да то ДОКАЖИ это приведя другое РАБОТАЮЩЕЕ решение
При этом мы сравним
a) Объем кода
b) Простоту сопровождения (насколько сложно внесение изменений в дизайн)
c) Читаемость
d) Производительность

Ну что, принимаешь вызов или слабо?


Хахаха... Вот тебе пример из 1с 80. Как отвечающая сторона я имею право выбора языка.
Как видишь, никаких внешних средств не использовано, сопровождение - раз плюнуть.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
//ТЗ - таблица с данными
//Поля - массив, содержащий список полей таблицы, которые нужно вывести
//ПоляСортировки - массив, содержащий список полей таблицы, по которым нужно отсортировать
//Возвращается в HTML код
Функция ДинамическаяСортировка(ТЗ, Поля, ПоляСортировки)
  CC="";
  Для Каждого ПолеСортировки ИЗ ПоляСортировки Цикл
    CC=CC+?(CC="","",",")+ПолеСортировки;
  КонецЦикла;
  ТЗ.Сортировать(СС);
  Для Каждого Стр ИЗ ТЗ  Цикл
    С=С+"<tr>";
    Для Каждого Поле ИЗ Поля
      С=С+"<td>"+Стр[Поле]+"</td>";
    КонецЦикла
    С=С+"</tr>";
  КонецЦикла
  Возврат С;
КонецФункции

Как видишь, в нормальных языках, где реально работают с данными, не забыли про динамическую сортировку.
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34435627
Fixin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SuSa FixinЯ привел пример примитивнейшей задачи, для которой нет решения в языке, хотя механизмы для этого все есть в языке . Т.е. это упущение языка.
То есть практически ты сказал. Это сделать можно, токо меня ломает, а вы додуматься не в состоянии как это сделать.
Fixin
Можно конечно написать свой аналог xlst:sort (например пузырьковую сортировку), но тогда зачем штатный механизм сортировки нужен.
штатный механизм сортировки нужен для тех кто так не извращается и писать ему в лом.
З.Ы. перенеси вопрос в новый топик, а то этот уже больно по трафику бъет. и вынеси уже те вопросы которые обсуждаются

Читай только последнюю страницу и с трафиком все будет ок, а не весь топик целиком.
Я не написал, что я знаю как сделать, но мне в лом.
Я написал, что все методы для решения этой примитивнейшей задачи выливаются за пределы XSLT - то есть или использование внешних кодов или повторение механизма сортировки (зачем нужен тогда штатный).
Чего тогда стоит XSLT, если он не умеет решить такую простейшую задачу.

Пока я вижу только понты. Решения нормального нет.
Вот все виды решения и все они кривые:

1. Динамически генерить код XSLT - слишком сложно и неэффективно.
2. Подключать другие языки - слишком сложно и неэффективно.
3. Забить заранее максимальное число сортировок - пока самый подходящий вариант, но, согласитесь, очень очень кривой.
4. Написать свою функцию сортировки по произвольному числу параметров - по сути повторить движок XSLT.
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34435628
dimzon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fixin
Хахаха... Вот тебе пример из 1с 80. Как отвечающая сторона я имею право выбора языка.
Как видишь, никаких внешних средств не использовано, сопровождение - раз плюнуть.

Хахаха...
Давай сравним производительность на 100000 строках ;)
Давай сравним насколько сложно будет менять дизайн ;)
У тебя, кстати, пока внешний вид НЕ СООТВЕТСВУЕТ тому который формирует твоя-же XSL :)

Так что пока твой ответ не засчитан
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34435636
Fixin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimzon Fixin
Хахаха... Вот тебе пример из 1с 80. Как отвечающая сторона я имею право выбора языка.
Как видишь, никаких внешних средств не использовано, сопровождение - раз плюнуть.

Хахаха...
Давай сравним производительность на 100000 строках ;)
Давай сравним насколько сложно будет менять дизайн ;)
У тебя, кстати, пока внешний вид НЕ СООТВЕТСВУЕТ тому который формирует твоя-же XSL :)

Так что пока твой ответ не засчитан

Димзон, извините, мне не о чем с вами разговаривать.
Потому что производительность будет совершенно одинакова.
Я к счастью, знаю и 1С и XSLT, и VBS, поэтому могу делать такие выводы.
Насчет дизайна - пора уже дизайн не в код выносить а в CSS.
Извините, я сделал ошибку, вы - профан.
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34435781
bobroudav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34436843
dimzon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FixinИзвините, я сделал ошибку, вы - профан.
За свои слова ОТВЕЧАТЬ надо!
Так, к сведению, на кого ты "сявкаешь"
MCP , MCTS , MCPD:EAD
VBScript Master , VB6 Master , JavaScript Master и ещё много чего




Я настаиваю на продолжении дуэли . Для этого ты должен предоставить код который
1) Принимает в качестве параметра XML DOM с твоим XML-ем (а то у тебя какой-то левый набор аргументов)
2) Формирует корректный HTML аналогичный тому который формируется в XSL-ном примере

FixinПотому что производительность будет совершенно одинакова.
Я к счастью, знаю и 1С и XSLT, и VBS, поэтому могу делать такие выводы.
Фиксин, ты мне конечно не поверишь, но я не только не имея 1С 80 но даже и не зная её вообще вижу в твоём "замечательном" коде уже 2 проблемы - одну ошибку и одну проблему с производительностью.
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34436876
Fixin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, с этой дуэлью мы отлонились от темы.
Гражданин хотел проявить свои понты, а не ответить на вопрос.
Вопрос остается прежний - XSLT не умеет сортировать по произвольному набору полей.
И это его существенный недостаток, как языка работы с данными.
Хочу аргументированных возражений или способа решения задачи, приведенной в примере.
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34436920
dimzon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FixinВ общем, с этой дуэлью мы отлонились от темы.
Сливаешь? А понтов то сколько кидал!

FixinВопрос остается прежний - XSLT не умеет сортировать по произвольному набору полей.
И это его существенный недостаток, как языка работы с данными.
Твой 1С тоже не умеет.
Fixin
Код: plaintext
ТЗ.Сортировать(СС);

Это вызов библиотечной функции, равносильно как и
dimzon
Код: plaintext
<xsl:for-each select="user:doSort(root/lines,root/info/orders/*)/*">
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34437071
andrei77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fixin думаю не честно говорить, что XSLT не умеет сортировать по произвольному набору полей. Я бы сказал, что говорить так совершенно безответственно. Ибо решения тебе предлагали, и продолжают это длеать. И не одно. Правильно писать так: XSLT не умеет сортировать по произвольному набору полей, так как я бы хотел чтобы он сортировал так что давай высказывайся от себя а не от XSLT, думаю что такой подход адекватнее.
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34437455
Fixin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrei77Fixin думаю не честно говорить, что XSLT не умеет сортировать по произвольному набору полей. Я бы сказал, что говорить так совершенно безответственно. Ибо решения тебе предлагали, и продолжают это длеать. И не одно. Правильно писать так: XSLT не умеет сортировать по произвольному набору полей, так как я бы хотел чтобы он сортировал так что давай высказывайся от себя а не от XSLT, думаю что такой подход адекватнее.

Андрей, вы разводите демагогию
В XSLT нельзя выбрать в цикле строки в порядке, если этот порядок задан в списке, а не заранее жестко определен.

Давайте подходить объективно.
А объективно - такой возможности нет. И это старнно для языка, позиционирующего себя как язык работы с данными.

Не кривых решений не было.
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34437463
Fixin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimzon
FixinВопрос остается прежний - XSLT не умеет сортировать по произвольному набору полей.
И это его существенный недостаток, как языка работы с данными.
Твой 1С тоже не умеет.
Fixin
Код: plaintext
ТЗ.Сортировать(СС);

Это вызов библиотечной функции, равносильно как и
dimzon
Код: plaintext
<xsl:for-each select="user:doSort(root/lines,root/info/orders/*)/*">


Разница только в том, что создатели 1С об этом позаботились, а XSLT - лажанулись и забыли. К тому же в XSLT оператор sort - это не функция, и именно его забыли реализовать в XSLT для случая, когда сортировка заранее не известна.
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34437518
Fixin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimzon FixinВ общем, с этой дуэлью мы отлонились от темы.
Сливаешь? А понтов то сколько кидал!
[/quot]

По просьбам Димзона размещаю полный код на языке 1С для сортировки XML и преобразования его в HTML.

В коде разбора XML документа в таблицу значений названия методов примерные - нет под рукой 1С, чтобы проверить, но объем кода от этого не меняестя. Все выглядит именно так.
Вызвать функцию ХМЛВХТМЛ с текстом XML, на выходе получим текст HTML.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
//ТЗ - таблица с данными
//Поля - массив, содержащий список полей таблицы, которые нужно вывести
//ПоляСортировки - массив, содержащий список полей таблицы, по которым нужно отсортировать
//Возвращается в HTML код
Функция ДинамическаяСортировка(ТЗ, Поля, ПоляСортировки)
  С="";
  CC="";
  Для Каждого ПолеСортировки ИЗ ПоляСортировки Цикл
    CC=CC+?(CC="","",",")+ПолеСортировки;
  КонецЦикла;
  ТЗ.Сортировать(СС);
  Для Каждого Стр ИЗ ТЗ  Цикл
    С=С+"<tr>";
    Для Каждого Поле ИЗ Поля
      С=С+"<td>"+Стр[Поле]+"</td>";
    КонецЦикла
    С=С+"</tr>";
  КонецЦикла
  Возврат С;
КонецФункции

//ХМЛ - текст ХМЛ
Функция ХМЛВХТМЛ(ХМЛ)
  Перем ТЗ;
  ТЗ=Новый ТаблицаЗначений();
  ХМЛДом=Новый ComObject("XMLDOM");
  ХМЛДом.load(XML);
  Узлы=ХМЛДом.Nodes("fields");
  Поля=Новый массив();
  Для Каждого Узел из Узлы Цикл
    Поля.Добавить(Узел.Value);
  КонецЦикла;
  ПоляСортировки=Новый массив();
  Узлы=ХМЛДом.Nodes("sort");
  Для Каждого Узел из Узлы Цикл
    ПоляСортировки.Добавить(Узел.Value);
  КонецЦикла;

  Для Каждого Поле из Поля Цикл
    ТЗ.Колонки.Добавить(Поле);
   КонецЦикла;

  Для Каждого Стр из ХМЛДОМ.Найти("line") Цикл
    НСтр=ТЗ.Добавить();
    Для Каждого Поле из Поля Цикл
      Зн=Стр.Nodes(Поле);
      НСтр[Поле]=Зн; 
    КонецЦикла;
  КонецЦикла
  Возврат ДинамическаяСортировка(ТЗ, Поля, ПоляСортировки);
КонецФункции
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34437565
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fixin ! Думаю я выражу общее мнение , если скажу: ЗАЕ...АЛ уже всех.
Сам написать не можешь, других мнений не слушаешь, еще и грязью всех поливаешь, типа Я ПУП ЗЕМЛИ А ВЫ ТУПЫЕ.
В общем если ты так уверен что это глюк языка иди на сайт создателя этого языка и предъявляй притензии им, а не нам!

З.Ы,. предлогаю больше ему не отвечать. А модератору вообще его запостить
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34437594
dimzon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SuSaFixin ! Думаю я выражу общее мнение , если скажу: ЗАЕ...АЛ уже всех.
Сам написать не можешь, других мнений не слушаешь, еще и грязью всех поливаешь, типа Я ПУП ЗЕМЛИ А ВЫ ТУПЫЕ.
В общем если ты так уверен что это глюк языка иди на сайт создателя этого языка и предъявляй притензии им, а не нам!

З.Ы,. предлогаю больше ему не отвечать. А модератору вообще его запостить
ПОГОДИТЕ ПОГОДИТЕ! ПОЖАЛУЙСТА, ДАЙТЕ МНЕ ЕМУ ОТВЕТИТЬ!
А то у нас такая дискуссия разыгралась http://www.liveinternet.ru/users/fixin/post35291394/page3.html
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34437706
Fixin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SuSaFixin ! Думаю я выражу общее мнение , если скажу: ЗАЕ...АЛ уже всех.
Сам написать не можешь, других мнений не слушаешь, еще и грязью всех поливаешь, типа Я ПУП ЗЕМЛИ А ВЫ ТУПЫЕ.
В общем если ты так уверен что это глюк языка иди на сайт создателя этого языка и предъявляй притензии им, а не нам!

З.Ы,. предлогаю больше ему не отвечать. А модератору вообще его запостить

По существу ответь: где нормальные решения? Нету! Потому что авторы языка просто забыли сделать сортировку. Я хочу, чтобы вы признали это, Господа XSLTисты. Пока что аргументов против не было.

Бан - это конечно спортивный метод ведения дискуссии.
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34437731
Fixin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SuSaFixin ! Думаю я выражу общее мнение , если скажу: ЗАЕ...АЛ уже всех.
Сам написать не можешь, других мнений не слушаешь, еще и грязью всех поливаешь, типа Я ПУП ЗЕМЛИ А ВЫ ТУПЫЕ.
В общем если ты так уверен что это глюк языка иди на сайт создателя этого языка и предъявляй притензии им, а не нам!

З.Ы,. предлогаю больше ему не отвечать. А модератору вообще его запостить

По поводу профессионализма.
В ветке http://www.sql.ru/forum/actualthread.aspx?tid=405106 мне тоже говорили - ты хочешь слишком многого, такое невозможно, пока я не написал скрипт. Наверное, местные посетители привыкли на XSLT решать узкие, одноразовые задачи и идея универсального решения им не понятна. Отсюда и нападки при полном отсутствии какого-либо приемлемого решения.
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34437881
dimzon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итак приступим
Исходная формулировка задачи
Моё решение вариант 1
Моё решение вариант 2
Решение Фиксина
Допустим что исходный XML содержит 1000 элементов <line>

Первым делом немного самокритики . Я считаю самым эффективным (особенно при больших размерах XML) из приведённых решений является Моё решение вариант 1 со следующими доработками:
1) Вместо конструкции
Код: plaintext
<xsl:variable name="CurrLine" select="."/>\n<xsl:for-each select="/root/info/fields/*">\n\t<td>\n\t\t<xsl:value-of select="$CurrLine/*[local-name()=current()/name]"/>\n\t</td>\n</xsl:for-each>
Надо генерировать XSLT аналогично тому как генерируются <xsl:sort>
2) Для удобства вместо хардкода текста XSLT в реальном приложении его проще вынести в ресурс или отдельный файл
3) Возможно(?) вместо использования макроса имеет смысл модифицировать XSL через DOM
4) Хорошо бы использовать более новые/быстрые версии XSLT-процессоров вместо MSXML3

Давайте теперь разберём вариант от Гения1С aka FIXIN (для тех кто не в курсе - Гений1С это то как он себя сам называет на форумах посвящённых 1C)
Для удобства разбора я скопипастил код Гения и пронумеровал его. Итак:
Код: plaintext
\n 01 \t//ТЗ - таблица с данными\n 02 \t//Поля - массив, содержащий список полей таблицы, которые нужно вывести\n 03 \t//ПоляСортировки - массив, содержащий список полей таблицы, по которым нужно отсортировать\n 04 \t//Возвращается в HTML код\n 04 \tФункция ДинамическаяСортировка(ТЗ, Поля, ПоляСортировки)\n 06 \t  С="";\n 07 \t  CC="";\n 08 \t  Для Каждого ПолеСортировки ИЗ ПоляСортировки Цикл\n 09 \t    CC=CC+?(CC="","",",")+ПолеСортировки;\n 10 \t  КонецЦикла;\n 11 \t  ТЗ.Сортировать(СС);\n 12 \t  Для Каждого Стр ИЗ ТЗ  Цикл\n 13 \t    С=С+"<tr>";\n 14 \t    Для Каждого Поле ИЗ Поля\n 15 \t      С=С+"<td>"+Стр[Поле]+"</td>";\n 16 \t    КонецЦикла\n 17 \t    С=С+"</tr>";\n 18 \t  КонецЦикла\n 19 \t  Возврат С;\n 20 \tКонецФункции\n 21 \n 22 \t//ХМЛ - текст ХМЛ\n 23 \tФункция ХМЛВХТМЛ(ХМЛ)\n 24 \t  Перем ТЗ;\n 25 \t  ТЗ=Новый ТаблицаЗначений();\n 26 \t  ХМЛДом=Новый ComObject("XMLDOM");\n 27 \t  ХМЛДом.load(XML);\n 28 \t  Узлы=ХМЛДом.Nodes("fields");\n 29 \t  Поля=Новый массив();\n 30 \t  Для Каждого Узел из Узлы Цикл\n 31 \t    Поля.Добавить(Узел.Value);\n 32 \t  КонецЦикла;\n 33 \t  ПоляСортировки=Новый массив();\n 34 \t  Узлы=ХМЛДом.Nodes("sort");\n 35 \t  Для Каждого Узел из Узлы Цикл\n 36 \t    ПоляСортировки.Добавить(Узел.Value);\n 37 \t  КонецЦикла;\n 38 \n 39 \t  Для Каждого Поле из Поля Цикл\n 40 \t    ТЗ.Колонки.Добавить(Поле);\n 41 \t  КонецЦикла;\n 42 \n 43 \t  Для Каждого Стр из ХМЛДОМ.Найти("line") Цикл\n 44 \t    НСтр=ТЗ.Добавить();\n 45 \t    Для Каждого Поле из Поля Цикл\n 46 \t      Зн=Стр.Nodes(Поле);\n 47 \t      НСтр[Поле]=Зн; \n 48 \t    КонецЦикла;\n 49 \t  КонецЦикла\n 50 \t  Возврат ДинамическаяСортировка(ТЗ, Поля, ПоляСортировки);\n 51 \tКонецФункции\n

Сначала самые мелкие придирки (простим эти мелочи Гению)
Данный код формирует "HTML" не соответствующий тому который формирует XSLT - вообще нет тега <table>, XSLT подкрашивает чётные/нечётные строки и.т.п.
Данный код при обработки сортировки не обрабатывает ASC/DESC

Ошибки
В действительности данный код работает направильно. Например при таком XML (символ # читать как & - особенности движка форума)
Код: plaintext
\n<line>\n\t<name type="S" sort="Иван Иванович">#amp;nbsp;</name>\n\t<categories type="S" sort="руководители">руководители</categories>\n\t<entryid type="S">000000009E5D45D68B62C44E8386C937DE30D92684852B00</entryid>\n\t<class type="U"> 40 </class>\n</line>\n
Для первого поля будет сформирован такой HTML (символ # читать как & - особенности движка форума)
Код: plaintext
\n\t<td>#nbsp;</td>\n
В то время как правильный HTML (символ # читать как & - особенности движка форума)
Код: plaintext
\n\t<td>#amp;nbsp;</td>\n
Т.е. Гений1С забывает кодировать спец-символы
Очевидно что строка 15 должна выглядеть как-нибудь так:
Код: plaintext
\n 15 \t      С=С+"<td>"+ ЗаменитьСлужебныеСимволыНаПоследовательности( Стр[Поле] )+"</td>";\n

Проблемы с производительностью (спорим такого Гений не ожидал)
Забудем на время что 1С- интерпретатор (замечу что современные XSLT-процессоры компилируют XSLT в выполняемый код)
Работа с XML DOM ( 26-49 )
Я не знаю что такое тип " ТаблицаЗначений " в 1C и насколько эффективно он работает, но с XML всё плохо.
Судя по объявлению переменной 26 используется позднее связывание и, соответственно, работа через IDispatch. При 1000 строк содержащих по 3 поля имеем 3000 вызовов IDispatch. Это на самом деле заметные расходы! (Замечу что XSLT-процессор внутри себя использует ранее связывание и.т.д.)

Но и это не самое страшное! Самое страшное по производительности кроется в 15 - конкатенация строк в цикле
Итак, что происходит при выполнении операции
Код: plaintext
S=S+"Some Text"
Происходит т.н. ReAlloc (перевыделение памяти)
Код: plaintext
\n 1 ) Выделяется область памяти размером = размер(S) + размер("Some Text")\n 2 ) В выделенную область копируется S\n 3 ) В выделенную область дописывается "Some Text"\n 4 ) Адрес дескриптора строки S устанавливается на новую область\n 5 ) Старая область памяти, использовавшаяся S освобождается\n
При 1000 строк содержащих по 3 поля имеем 3000 перевыделений. Это ОГРОМНАЯ потеря производительности, учитывая что под конец цикла 12-18 в переменной C бултыхаются мегабайты.
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34438010
TiG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimzon
1) .... Надо генерировать XSLT аналогично тому как генерируются <xsl:sort>
2) Для удобства вместо хардкода текста XSLT в реальном приложении его проще вынести в ресурс или отдельный файл
3) Возможно(?) вместо использования макроса имеет смысл модифицировать XSL через DOM
4) Хорошо бы использовать более новые/быстрые версии XSLT-процессоров вместо MSXML3


1 + 2) Если генерировать текст XSLT, то смысла ограничивать себя нет - полностью юзать все преимущества. А именно иметь отдельный общий xslt, который преобразует исходный xml с описанием данных и порядка сортировки во второй xslt (рабочая трансформация), который уже будет оптимально сформирован под данную структуру xml. И одновременно решаем кроме проблемы производительности еще и проблему хард-кодинга и реюзинга ;-))
3) Если код несложный, то проще так. Через DOM и код чуть более сложный и работать помедленнее будет. А вообще лучше темплейты в таких случаях юзать - см. п.1-2.
4) Мелкософтовский сишный парсер вроде бы в свое время был одним из самых быстрых. Сейчас уже нет ?
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34438050
TiG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TiG1 + 2) Если генерировать текст XSLT, то смысла ограничивать себя нет - полностью юзать все преимущества. А именно иметь отдельный общий xslt, который преобразует исходный xml с описанием данных и порядка сортировки во второй xslt (рабочая трансформация), который уже будет оптимально сформирован под данную структуру xml. И одновременно решаем кроме проблемы производительности еще и проблему хард-кодинга и реюзинга ;-))

Т.е. получаем 2х-этапную схему:
1) XML со структурой + мета-трансформация -> рабочая трансформация
2) XML с данными + рабочая трансформация -> конечный результат

ЗЫ может именно этого от нас добивался наш скромный (на этом форуме ;)))) коллега Гений1С ?
...
Рейтинг: 0 / 0
Можно ли отсортировать в конструкции for-each в динамическом порядке.
    #34438080
dimzon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TiG
1 + 2) Если генерировать текст XSLT, то смысла ограничивать себя нет - полностью юзать все преимущества. А именно иметь отдельный общий xslt, который преобразует исходный xml с описанием данных и порядка сортировки во второй xslt (рабочая трансформация), который уже будет оптимально сформирован под данную структуру xml. И одновременно решаем кроме проблемы производительности еще и проблему хард-кодинга и реюзинга ;-))
Частично согласен, применимость зависит от см. ниже

TiG
3) Если код несложный, то проще так. Через DOM и код чуть более сложный и работать помедленнее будет. А вообще лучше темплейты в таких случаях юзать - см. п.1-2.

Тут встаёт вопрос производительности. Например мы пишем сервер приложений, обрабатывающий множество запросов от пользователей. При использовании макросов мы тратим время на парсинг строки в DOM. При использовании XSLT->XSLT мы тратим время на конструирование большого XSLT.
При модификации через DOM мы можем сделать что-то вроде:
Код: plaintext
1.
2.
concreteXSL = templateXSL.cloneNode(true); // Не надо лишний раз парсить
insertSortClauses(concreteXSL); // Просто вставим нужные xsl:sort-ы

TiG
4) Мелкософтовский сишный парсер вроде бы в свое время был одним из самых быстрых. Сейчас уже нет ?
В данном случае речь идёт не сколько о самом парсере сколько о XSLT-процессоре (компоненте котрый умеет выполнять XSLT) + скорости выполнения XPath
Например MSXML4 примерно в 2-3 раза быстрее MSXML3 за счёт индексирования XML и соотв. ускорения выполнения XPath
А MSXML из .NET 2.0 ещё быстрее за счёт JIT-компиляции, т.е. он генерирует из XSLT выполняемый код :) Более того этот код можно сбросить на винт в виде DLL.
...
Рейтинг: 0 / 0
25 сообщений из 82, страница 3 из 4
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Можно ли отсортировать в конструкции for-each в динамическом порядке.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]