Portál AbcLinuxu, 13. července 2025 18:50


Dotaz: Filtrování podle vzoru v XSLT 1.0

5.12.2008 11:01 esparky
Filtrování podle vzoru v XSLT 1.0
Přečteno: 392×
Odpovědět | Admin

Dobrý den,
potřeboval bych poradit s následujícím problémem.
Mám vstup:
<msg type="abc/>
<msg type="bcd">
<msg type="abcd">

Rád bych provedl nějakou akci, pro všechny entity jejichž atribut type odpovídá
nějaké masce (např "ab*")

V XSLT 2.0 se to nejspíš dělá pomocí matches:
<xsl:if test="matches(jmeno,'ab*')">Vystup</xsl:if>

Můj program však používá xslt procesor, který umí pouze XSLT 1.0 (libxslt).
Je nějaká možnost jak to provést v XSLT 1.0

Děkuji

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

default avatar 5.12.2008 23:34 default | skóre: 22 | Madrid
Rozbalit Rozbalit vše Re: Filtrování podle vzoru v XSLT 1.0
Odpovědět | | Sbalit | Link | Blokovat | Admin
Přílohy:

Ahoj,

já bych být tebou nějak nakombinoval funkce z XSLT 1.0. Takže například starts-with(), contains() a tak podobně.

Já osobně libxslt nepoužívám, ale používám Javí implementaci XSLT 1.0. V příloze máš test case pro xmlUtilities. Když ty soubory nahraješ do balíku testů, global.sandbox.xmlutilities, tak si s tím můžeš pohrát.

Můj zdrojový XML je

<?xml version="1.0" encoding="UTF-8"?>
<root>

    <msg type="abc">abc</msg>
    <msg type="bcd">bcd</msg>
    <msg type="abcd">abcd</msg>

</root>

Můj XSLT je

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

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />

    <xsl:template match="/">
        <xsl:element name="result-root">
            <xsl:apply-templates />
        </xsl:element>
    </xsl:template>
    
    <xsl:template match="//msg">
        <xsl:if test="starts-with(@type, 'ab') and contains(@type, 'bc')">
            <xsl:element name="result-element">
                <xsl:value-of select="." />
            </xsl:element>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

Výstup je

<?xml version="1.0" encoding="UTF-8"?>
<result-root>

    <result-element>abc</result-element>
    
    <result-element>abcd</result-element>

</result-root>

Tak dej vědět, jak jsi pokročil. Jo — a kdyžtak postni nějaký příklad, se kterým si můžu pohrát; takhle na sucho se dost těžko něco vymejšlí.

6.12.2008 06:41 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: Filtrování podle vzoru v XSLT 1.0
s libxslt je (asi zalezi podla distribucie, moze byt oddelene) programcek xsltproc.
btw, java implementacii je viacero, osobne mi napr sakra problem robilo pouzivat xalan a saxon zaroven, podla poradia jarov v classpath fungoval bude jeden alebo druhy ...
default avatar 6.12.2008 23:41 default | skóre: 22 | Madrid
Rozbalit Rozbalit vše Re: Filtrování podle vzoru v XSLT 1.0
s libxslt je (asi zalezi podla distribucie, moze byt oddelene) programcek xsltproc.

Jo, to je pravda. Ale nejsem s tím moc kamarád. Přecijen v Javě jsem na to lépe…

osobne mi napr sakra problem robilo pouzivat xalan a saxon zaroven, podla poradia jarov v classpath fungoval bude jeden alebo druhy ...

No, jsou dva způsoby, jak v tom udělat pořádek:

  1. používat právě jednu implementaci a její JAR dát do endorsed adresáře
  2. v případě, že je třeba vícero implementací vrámci jedné JVM, pak upravit JARy implementací, napsat vlastní ServiceLoader (v našem případě implementaci javax.xml.transformer.TransformerFactory) a vše dát opět do endorsed adresáře. Když nemůžeme použít endorsed adresář, pak musíme správně napsat svůj vlastní class loader a dát si sakra pozor na různé Javí implementace (to, co funguje pod Sun JVM, nemusí fungovat pod IBM JVM a tak podobně). A nebo
  3. nepoužívat javax.xml.transformer.TransformerFactory a používat rovnou konkrétní implementace, ale to znamená důkladnou znalost jejich vnitřností.
7.12.2008 14:40 esparky
Rozbalit Rozbalit vše Re: Filtrování podle vzoru v XSLT 1.0

Předem děkuji všem za odpověď.

Program je napsán v C++ (je použita knihovna libxslt z gnome, nedošlo mi, že její jméno se asi kryje i s nějakou knihovnou používanou v javě). Volání xsltproc se mi moc nehodí (transformace je volána i několikrát za sekundu), ale když bude nejhůř, tak bych jej asi použil.

Vaše odpovědi chápu tak, že asi jednoduchý problém jak vyřešit moji transformaci v XSLT 1.0 neí, existuje tedy nějaká C/C++ knihovna podporující XSLT 2.0? Nejlépe taková aby pro ni existoval i port pro OpenWRT.

Předem dík za jakékoli nakopnutí správným směrem

default avatar 7.12.2008 17:33 default | skóre: 22 | Madrid
Rozbalit Rozbalit vše Re: Filtrování podle vzoru v XSLT 1.0

 

Program je napsán v C++ (je použita knihovna libxslt z gnome, nedošlo mi, že její jméno se asi kryje i s nějakou knihovnou používanou v javě).

 

 

Nekryje. Akorát tyhle věci jsem zvyklej dělat v Javě a mám na to pár projektů, takže napsat příklad a odladit ho je otázka chvilky. Navíc vím, jako část standardu který Xalan implementuje a jakou ne. A když už jsme u toho Xalanu, tak se dělá i pro C++, ale nevím, v jakém je stavu — nikdy jsem si s tím nehrál.

 

Předem dík za jakékoli nakopnutí správným směrem

 

Jak jsem psal dole: zkusil bych to EXSLT.

7.12.2008 14:44 esparky
Rozbalit Rozbalit vše Re: Filtrování podle vzoru v XSLT 1.0

Moc dík, za vyčerpávající odpověď...zkusím si vystačit s start_with(i když regex je regex:-) ), popř zkusím najít jinou knihovnu, která xslt 2.0 implementuje (viz můj druhý příspěvek v tomto threadu)

default avatar 7.12.2008 17:26 default | skóre: 22 | Madrid
Rozbalit Rozbalit vše Re: Filtrování podle vzoru v XSLT 1.0

Můžeš si zkusit tu funkci matches() naimplementovat sám. :-) Ale možná bude stačit přepnout do EXSLT. V tomto rozšíření jsou regulární výrazy k dispozici.

Daniel Kvasnička ml. avatar 8.12.2008 08:24 Daniel Kvasnička ml. | skóre: 52 | blog: The Joys and Sorrows of Being an IT Freak | Ostrava
Rozbalit Rozbalit vše Re: Filtrování podle vzoru v XSLT 1.0
No akorat ze podle jejich informaci funkci matches() nepodporuje ani Xalan ani libxslt...
FSF: “screw you for not wanting the stuff we produce”, People: “screw you for not producing the stuff we want."
default avatar 8.12.2008 10:00 default | skóre: 22 | Madrid
Rozbalit Rozbalit vše Re: Filtrování podle vzoru v XSLT 1.0

…protože funkce matches() je až v XPath 2.0 a Xalan i libxslt implementují jen XPath 1.0.

Proto mě napadlo to EXSLT, které to řeší funkcí, která se akorát jinak jmenuje — a podle webu to vypadá, že libxslt nám EXSLT podporuje (libexslt).

8.12.2008 14:09 esparky
Rozbalit Rozbalit vše Re: Filtrování podle vzoru v XSLT 1.0

Díky,EXSLT vypadá slibně, vyzkouším a dám vědět, jak to dopadlo

Daniel Kvasnička ml. avatar 8.12.2008 14:45 Daniel Kvasnička ml. | skóre: 52 | blog: The Joys and Sorrows of Being an IT Freak | Ostrava
Rozbalit Rozbalit vše Re: Filtrování podle vzoru v XSLT 1.0
To jsme si nerozumeli. Ja vim, ze to patri do 2.0 a ze libxslt neco z EXSLT implementuje... ale neimplementuje tuto konkretni funkci. Na strance kazde fce z EXSLT mate dole sekci IMPLEMENTATIONS a u matches() tam libxslt chybi.

Pokud ovsem ty informace nemaji zastarale. Coz je pak problem tvurcu enginu, ze o tom nedaji vedet.
FSF: “screw you for not wanting the stuff we produce”, People: “screw you for not producing the stuff we want."
default avatar 8.12.2008 15:02 default | skóre: 22 | Madrid
Rozbalit Rozbalit vše Re: Filtrování podle vzoru v XSLT 1.0

Jo, už to chápu, o co jde.

No, pakliže lib(e)xslt nic takového nepodporuje, není nic jednoduššího, než si napsat své vlastní rozšíření. :-) Ale jak se takové věci píší pro lib(e)xslt — to neumím a netuším. Já dělal rozšíření jen pro Xalan-J. :-(

8.12.2008 20:46 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: Filtrování podle vzoru v XSLT 1.0
na to existuje nieco take, ako function-available a/alebo element-available, imho jedina spolahliva cesta, ako o xslt procesore nieco zistit.
default avatar 8.12.2008 21:07 default | skóre: 22 | Madrid
Rozbalit Rozbalit vše Re: Filtrování podle vzoru v XSLT 1.0

Zeptám se filozoficky: Víš, jaký XSLT transformátor v produkci máš; a přesto bys prováděl tyto kontroly?

Když ti admin pod rukama vymění knihovnu, tak se o tom oba dovíte z logu, ne? :-D

8.12.2008 23:25 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
Rozbalit Rozbalit vše Re: Filtrování podle vzoru v XSLT 1.0
Zeptám se filozoficky: Víš, jaký XSLT transformátor v produkci máš; a přesto bys prováděl tyto kontroly?
Jestli jde z XSL transformace vyhodit výjimka, tak jo :-D
Ještě na tom nejsem tak špatně, abych četl Viewegha.
default avatar 9.12.2008 09:19 default | skóre: 22 | Madrid
Rozbalit Rozbalit vše Re: Filtrování podle vzoru v XSLT 1.0

Určitě z toho něco vymáčknout půjde: :-D

init:
deps-jar:
compile:
Copying 1 file to /Users/petr/NetBeansProjects/xmlutilities/build/test/classes
compile-test-single:
Testsuite: global.sandbox.xmlutilities.XSLTTest1
Neznámý identifikátor SystemId; Řádek #0; Sloupec #0; Nelze nalézt funkci: matches
Neznámý identifikátor SystemId; Řádek #0; Sloupec #0; nebyl nalezen token funkce.
(Chyba se vyskytla na neznámém místě)java.lang.NullPointerException
Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0,88 sec

------------- Standard Error -----------------
Neznámý identifikátor SystemId; Řádek #0; Sloupec #0; Nelze nalézt funkci: matches
Neznámý identifikátor SystemId; Řádek #0; Sloupec #0; nebyl nalezen token funkce.
(Chyba se vyskytla na neznámém místě)java.lang.NullPointerException
------------- ---------------- ---------------
Testcase: testTransformation(global.sandbox.xmlutilities.XSLTTest1):        Caused an ERROR
null
java.lang.NullPointerException
        at global.sandbox.xmlutilities.XMLUtilities.transformToString(XMLUtilities.java:602)
        at global.sandbox.xmlutilities.XMLUtilities.transformToString(XMLUtilities.java:694)
        at global.sandbox.xmlutilities.XSLTTest1.testTransformation(XSLTTest1.java:44)


Test global.sandbox.xmlutilities.XSLTTest1 FAILED
/Users/petr/NetBeansProjects/xmlutilities/nbproject/build-impl.xml:566: Some tests failed; see details above.
BUILD FAILED (total time: 2 seconds)
9.12.2008 13:41 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: Filtrování podle vzoru v XSLT 1.0
ide, <message>
9.12.2008 13:40 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: Filtrování podle vzoru v XSLT 1.0
no, vlastne neviem :-) ty si nikdy nerobil prenosne aplikacie? a pritom su toho manualy javy plne ... :-)

a naco je to dobre? no napr na to, aby si v pripade pritomnosti rozsirenia pouzil rozsirenie (10ms/call), inak pouzijes pomalsiu vlastnu sablonu (100ms/call). A transformacia pobezi vzdy, hoci s rozdielnym vykonom.

default avatar 9.12.2008 14:49 default | skóre: 22 | Madrid
Rozbalit Rozbalit vše Re: Filtrování podle vzoru v XSLT 1.0
no, vlastne neviem :-) ty si nikdy nerobil prenosne aplikacie? a pritom su toho manualy javy plne ... :-)

Vždy dělám aplikace přenosné. Ale klíčem k mému úspěchu je přenositelnost na platformy (typ OS), né na knihovny. Proč? Proč se vázat na konkrétní implementaci?

  1. znám její výhody a nevýhody
  2. můžu svůj kód optimalizovat na výkon s konkrétní knihovnou
  3. můj kód je kratší, tudíž obsahuje méně chyb
  4. lépe se opravují chyby (méně testovacích a vývojových prostředí, vpodstatě kartézský součin všech možností všech implementací všeho)

Pro cílové uživatele z toho plynou tyto výhody:

  • triviální instalace
  • netřeba dohledávat a stahovat něco dalšího odněkud z internetu a zkoušet, zda to pojede
  • jednodušší konfigurace
  • plně funkční vyladěná aplikace

Problém je ten, že já tvořím cílové aplikace; né Spring Framework a jeho konektory na další Strutsy přes JMS do JDBC, nebo Hibernate přes JMX :-) a já nevím co ještě — jo JNDI a OSGI. :-D

Takže z mého pohledu jsou tyto kontroly jen výkonnostní brzdou. :-/

Ale to jsme už zaběhli do tématu filozofického přístupu k vývoji software a o tom tato diskuze není. A konec konců — borec bude také jen stuck with C++ :-D A když už jsme u toho cé plus plus, tak jedna fakt podařená, která se sem teď hodí :-D

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.