vitus_wagner: My photo 2005 (Default)
[personal profile] vitus_wagner
[livejournal.com profile] lqp навел на полезный инструмент - оказывается наконец написали аналог sed/grep etc для XML.
Называется XMLStarLet.
В дистрибутиве есть.

Date: 2009-02-19 09:35 am (UTC)
From: [identity profile] lqp.livejournal.com
Ну, честно говоря по сравнению с настоящим sed он громоздок и косноязычен, увы.

Так что xml это по прежнему не формат для людей.

Date: 2009-02-19 01:51 pm (UTC)
From: [personal profile] ramendik
Мне сложно представить себе что-то косноязычное в сравнении с sed ;)

Date: 2009-02-19 10:42 am (UTC)
From: [identity profile] alamar.livejournal.com
А если по его командам шпаргалка какая?

P.S. xpath дает прикурить всему.

Date: 2009-02-19 11:49 am (UTC)
From: [identity profile] alamar.livejournal.com
Это и плохо, хочется шпаргалки на пару страниц :)

Date: 2009-02-19 09:24 pm (UTC)
From: [identity profile] buldozr.livejournal.com
xpath дает прикурить всему

Верно. Зачем нужны sed и grep, когда есть XSLT? Там во второй версии даже регвыражения вроде пробили, все как у людей. Если и этого не хватает, тут уже что-то на серьезном скриптовом языке надо писать.

Date: 2009-02-19 10:00 pm (UTC)
From: [identity profile] alamar.livejournal.com
XSLT, к сожалению, ни в каком виде не имеет eval-режима.

Минимальный объем XSLT - всё же шаблон строк на 10.

Вместо дерга grep или sed ну никак не катит. А вот просто выборки xpath очень хороши, но вот чего не хватает в голом xpath, так это переменных для выполнения в несколько шагов: хочется выбрать $a = //A[...]; а потом уже вывести $a/../../something.

Date: 2009-02-19 10:03 pm (UTC)
From: [identity profile] buldozr.livejournal.com
XSLT, к сожалению, ни в каком виде не имеет eval-режима.

Ну, он много чего не имеет... Это для чего-то конкретно нужно?

Date: 2009-02-19 10:08 pm (UTC)
From: [identity profile] buldozr.livejournal.com
Или я не понял и "eval-режим" это возможность запустить однострочный скрипт из командной строки. С XML это возможно, но экстремально :)

Date: 2009-02-20 08:13 am (UTC)
From: [identity profile] alamar.livejournal.com
Да-да
Можно сказать grep строка файл
Можно сказать xpath дорожка файл
Это займет десять секунд.

А вот нельзя сказать xsltproc шаблон файл, потому что шаблон написать надо, а это уже минимум минут пять.
Поэтому я всячески приветствую создание инструментов более простых, чем полноценный XSLT, но более мощных, чем простой xpath.

Date: 2009-02-19 06:39 pm (UTC)
From: [identity profile] bulg.livejournal.com
Наконец?! Да я им уже года три как пользуюсь!
А вообще, если вас интересуют утилиты для grep-анья XML, могу кроме XMLStarlet посоветовать также Xtract (http://www.cs.york.ac.uk/fp/Xtract/) и sgrep (http://www.cs.helsinki.fi/u/jjaakkol/sgrep.html) (последний выглядит более мощным, но под Windows мне его запустить не удалось)

Date: 2009-02-20 04:30 am (UTC)
arilou: (Default)
From: [personal profile] arilou
"но под Windows мне его запустить не удалось"

Ну вот уж Витуса это врядли опечалит. ;)

Date: 2009-03-01 10:14 pm (UTC)
From: [identity profile] http://users.livejournal.com/_winnie/
Не подскажешь, можно ли сделать при помощи xmlstarlet выборку по таблице, нужно пройтись по всем //is/i/@t и по ним распечать //es/e/@y если //es/e/@x == @ ?

<root>
    <is>
        <i t="a"/>
        <i t="a"/>
        <i t="a"/>
        <i t="b"/>
        <i t="b"/>
        <i t="a"/>
        <i t="c"/>
    </is>
    <es>
        <e x="a" y="111"/>
        <e x="b" y="222"/>
        <e x="c" y="333"/>
    </es>
</root>



превращается в 111 111 111 222 222 111 333


xml sel -t -m //is/i -m //es/e[@x=/@t] -v @y -n lookup.xml
не знаю, что ставить на месте ???

Если не два вложеных xsl:for-each ( вложенных -m ), а просто //es/e[@x=//is/i/@t], то кажется //is/i/@t воспринимается как множество, а не как список, поэтому игнорируется порядок дубликатов.

PS. в XSLT и XPath сильно плаваю, знаю только самые-самые верха. Пробовал поискать в гугле, но испльзуются некие xsl:variable которые тут из командной строки недоступны.

Кстати, у меня сложилось впечатление, что проще писать циклы в скрипте по DOM-дереву, с выборкой по xpath, чем XSLT, хотя и это наверное и не оптимально. Есть ли какой-то общепризнанный синтаксический сахар над XSLT?

Date: 2009-03-02 08:19 am (UTC)
From: [identity profile] ibnteo.livejournal.com
В XSLT есть такая функция как current():
<xsl:for-each select="is/i[@t]">
  <xsl:value-of select="../../es[@x=current()/@t]/@y"/>
</xsl:for-each>

Date: 2009-03-02 10:53 pm (UTC)
From: [identity profile] http://users.livejournal.com/_winnie/
Сработало, спасибо!
xml sel -t -m //is/i/@t -v //es/e[@x=current()]/@y -n test.xml


PS. Когда искал синтаксический сахар, нашёл SLAX, обсуждение (http://www.mail-archive.com/xslt@gnome.org/msg00674.html), код (http://code.google.com/p/libslax/), дока (http://www.juniper.net/techpubs/software/junos/junos83/swconfig83-automation/download/slax-overview.pdf). Попробовал скомпилировать, но запустить реальные примеры пока не получилось.


Profile

vitus_wagner: My photo 2005 (Default)
vitus_wagner

April 2026

S M T W T F S
    123 4
5 6 7 89 1011
12 13 1415161718
19202122232425
2627282930  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Apr. 14th, 2026 10:11 pm
Powered by Dreamwidth Studios