Thread View: pl.comp.xml
10 messages
10 total messages
Started by zbyszek malec
Thu, 13 Mar 2008 12:02
XSLT wybranie node'ów odpowiadających innym node'om
Author: zbyszek malec
Date: Thu, 13 Mar 2008 12:02
Date: Thu, 13 Mar 2008 12:02
31 lines
1518 bytes
1518 bytes
Witam Mam następujący dokument xml: <data> <usages> <usage table="A"/> <usage table="B"/> </usages> <tables> <table name="A"/> <table name="B"/> <table name="C"/> </tables> </data> Teraz chciałbym napisać takie XSLT żeby mi wybrało elementy z tables takie, które występują w elementach usage, tzn. takie że atrybut table w usage jest taki sam jak atrybut name w table. Nie bardzo mam pomysł jak to zrobić. Próbowałem coś na kształt: <xsl:for-each select="tables/table[count(usages/usage[@table=@name])=0]"> </xsl:for-each> ale jak widać bez powodzenia. Da się to zrobić w XSLT? Pozdrawiam Zbyszek Malec -- Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Re: XSLT wybranie node'ów odpowiadających innym node'om
Author: szomiz
Date: Thu, 13 Mar 2008 12:15
Date: Thu, 13 Mar 2008 12:15
50 lines
2488 bytes
2488 bytes
Użytkownik "zbyszek malec" <zbyszanna@gazeta.SKASUJ-TO.pl> napisał w
wiadomości news:frb54a$gcc$1@inews.gazeta.pl...
> Witam
> Mam następujący dokument xml:
>
> <data>
> <usages>
> <usage table="A"/>
> <usage table="B"/>
> </usages>
>
> <tables>
> <table name="A"/>
> <table name="B"/>
> <table name="C"/>
> </tables>
> </data>
>
> Teraz chciałbym napisać takie XSLT żeby mi wybrało elementy z tables
> takie,
> które występują w elementach usage, tzn. takie że atrybut table w usage
> jest
> taki sam jak atrybut name w table. Nie bardzo mam pomysł jak to zrobić.
> Próbowałem coś na kształt:
> <xsl:for-each select="tables/table[count(usages/usage[@table=@name])=0]">
> </xsl:for-each>
select="table[/data/usages/usage[@table=current()/@name]]"
I takie wyrazenie oddaje wprost twoje wymaganie.
Mozna to jednak zrobic zarowno sprytniej jak i wydajniej.
<xsl:key name="uTables" match="/data/usages/usage" use="@table"/>
...
<xsl:apply-templates select="table"/>
...
<xsl:template match="table"/>
<xsl:template match="table[key('uTables',@name)]">
...
</xsl:template>
> ale jak widać bez powodzenia. Da się to zrobić w XSLT?
Jak widac da sie. Co wiecej, nazwa klucza jest /concat'owalnym/ stringiem.
Co mozna wykorzystac do quasi-dynamicznego parametryzowania wywolan ;)
sz.
Re: XSLT wybranie node'ów odpowiadających innym node'om
Author: zbyszek malec
Date: Thu, 13 Mar 2008 13:18
Date: Thu, 13 Mar 2008 13:18
71 lines
2702 bytes
2702 bytes
szomiz <szomiz@kocha.dostawac.reklamy.przez.net> napisał(a):
> select="table[/data/usages/usage[@table=current()/@name]]"
Dzięki za pomoc, jednak coś dalej nie działa, a nie potrafię samodzielnie
zlokalizować problemu.
Mam taki XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0"
xmlns:html="http://www.w3.org/1999/xhtml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xsi:schemaLocation="http://www.w3.org/1999/XSL/Transform
xslt.xsd"
>
<xsl:output method="text" indent="yes"/>
<xsl:template match="/data/tables">
<xsl:for-each select="table[/data/usages/
usage[@table=current()/@name]]">
bbbb
</xsl:for-each>
</xsl:template>
</xsl:transform>
Oraz taki xml:
<?xml version="1.0" encoding="UTF-8"?>
<data>
<usages>
<usage table="A"/>
<usage table="B"/>
</usages>
<tables>
<table name="A"/>
<table name="B"/>
<table name="C"/>
</tables>
</data>
Daje w rezultacie pusty plik, zamiast oczekiwanego "bbbb bbbb".
> Mozna to jednak zrobic zarowno sprytniej jak i wydajniej.
>
> <xsl:key name="uTables" match="/data/usages/usage" use="@table"/>
>
> ...
> <xsl:apply-templates select="table"/>
> ...
>
> <xsl:template match="table"/>
> <xsl:template match="table[key('uTables',@name)]">
> ...
> </xsl:template>
>
> > ale jak widać bez powodzenia. Da się to zrobić w XSLT?
>
> Jak widac da sie. Co wiecej, nazwa klucza jest /concat'owalnym/ stringiem.
> Co mozna wykorzystac do quasi-dynamicznego parametryzowania wywolan ;)
Nad tym się zastanowię, jak XSLT będzie dla mnie bardziej intuicyjne (czytaj
nabiorę wprawy) ;)
Pozdrawiam
Zbyszek Malec
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Re: XSLT wybranie node'ów odpowiadających innym node'om
Author: szomiz
Date: Thu, 13 Mar 2008 13:43
Date: Thu, 13 Mar 2008 13:43
38 lines
2458 bytes
2458 bytes
Użytkownik "zbyszek malec" <zbyszanna@WYTNIJ.gazeta.pl> napisał w wiadomości news:frb9jb$924$1@inews.gazeta.pl... > szomiz <szomiz@kocha.dostawac.reklamy.przez.net> napisał(a): > >> select="table[/data/usages/usage[@table=current()/@name]]" > > Dzięki za pomoc, jednak coś dalej nie działa, a nie potrafię samodzielnie > zlokalizować problemu. Faktycznie, nie zadziala. Sie zagalopowalem. current()/@name odnosi sie do kontekstu szablonu, czyli do tables, a tam zadnego @name nie ma. Trza by if'nac wewnatrz for-each. Chyba faktycznie nie da sie osiagnac efektu, jaki jest potrzebny _tylko_ przy pomocy for-each. Ale to jest kolejny powod, dla ktorego for-each powinno zostac zakazane ;-) Przejdz na apply-templates / template. > > Mam taki XSLT: > <?xml version="1.0" encoding="UTF-8"?> > <xsl:transform version="1.0" > xmlns:html="http://www.w3.org/1999/xhtml" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > xsi:schemaLocation="http://www.w3.org/1999/XSL/Transform > xslt.xsd" > > > > <xsl:output method="text" indent="yes"/> BTW: _Taka_ lista deklaracji przestrzeni nazw przy tekscie na wyjsciu? schemaLocation jako odwolanie do zewnetrznego adresu? sz.
Re: XSLT wybranie node'ów odpowiadających innym node'om
Author: zbyszek malec
Date: Thu, 13 Mar 2008 13:53
Date: Thu, 13 Mar 2008 13:53
35 lines
1927 bytes
1927 bytes
szomiz <szomiz@kocha.dostawac.reklamy.przez.net> napisał(a): > Ale to jest kolejny powod, dla ktorego for-each powinno zostac zakazane ;-) > > Przejdz na apply-templates / template. Ok, spróbuję w ten sposób. > > > > Mam taki XSLT: > > <?xml version="1.0" encoding="UTF-8"?> > > <xsl:transform version="1.0" > > xmlns:html="http://www.w3.org/1999/xhtml" > > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > > xsi:schemaLocation="http://www.w3.org/1999/XSL/Transform > > xslt.xsd" > > > > > > > <xsl:output method="text" indent="yes"/> > > BTW: _Taka_ lista deklaracji przestrzeni nazw przy tekscie na wyjsciu? Bo to jest przykład powstały z uproszczenia, xmlnsy zostały z rzeczywistego xslt. > schemaLocation jako odwolanie do zewnetrznego adresu? A to na potrzeby walidacji w Eclipse. Pozdrawiam Zbyszek Malec -- Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Re: XSLT wybranie node'ów odpowiadających innym node'om
Author: zbyszek malec
Date: Thu, 13 Mar 2008 14:11
Date: Thu, 13 Mar 2008 14:11
24 lines
1652 bytes
1652 bytes
szomiz <szomiz@kocha.dostawac.reklamy.przez.net> napisał(a): > current()/@name odnosi sie do kontekstu szablonu, czyli do tables, a tam > zadnego @name nie ma. > Trza by if'nac wewnatrz for-each. Chyba faktycznie nie da sie osiagnac > efektu, jaki jest potrzebny _tylko_ przy pomocy for-each. Użyłem jednak for-each na tabelach i ifnąłem i działa! Dzięki za wskazówki. Ostatecznie: <xsl:template match="/data/tables"> <xsl:for-each select="table"> <xsl:if test="count(/data/usages/ usage[@table=current()/@name]) > 0"> bbbb </xsl:if> </xsl:for-each> </xsl:template> Pozdrawiam Zbyszek Malec -- Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Re: XSLT wybranie node'ów odpowiadających innym node'om
Author: szomiz
Date: Thu, 13 Mar 2008 14:27
Date: Thu, 13 Mar 2008 14:27
35 lines
2116 bytes
2116 bytes
Użytkownik "zbyszek malec" <zbyszanna@WYTNIJ.gazeta.pl> napisał w wiadomości news:frbcmd$pm5$1@inews.gazeta.pl... > Użyłem jednak for-each na tabelach i ifnąłem i działa! Dzięki za > wskazówki. I chcesz o tym porozmawiac? ;) > Ostatecznie: > <xsl:template match="/data/tables"> > <xsl:for-each select="table"> > <xsl:if test="count(/data/usages/ > usage[@table=current()/@name]) > 0"> > bbbb > </xsl:if> > </xsl:for-each> > </xsl:template> Po co count? Zmuszasz procesor do liczenia czegos, co nie jest do niczego potrzebne :/ Wystarczy: /data/usages/usage[@table=current()/@name] Mozna wrecz profilaktycznie: /data/usages/usage[@table=current()/@name][1] Efekt- zapewniam - ten sam. Niedawno pisalem: nie mam nic przeciwko walce z bezrobociem, tylko dlaczego w krajach, w ktorych produkuje sie procesory i pamieci. sz.
Re: XSLT wybranie node'ów odpowiadających innym node'om
Author: TOUDIdel
Date: Sun, 16 Mar 2008 00:58
Date: Sun, 16 Mar 2008 00:58
29 lines
2109 bytes
2109 bytes
Użytkownik "szomiz" <szomiz@kocha.dostawac.reklamy.przez.net> napisał w
wiadomości news:frb5us$bo5$1@atlantis.news.neostrada.pl...
> Mozna to jednak zrobic zarowno sprytniej jak i wydajniej.
> <xsl:key name="uTables" match="/data/usages/usage" use="@table"/>
> ...
> <xsl:apply-templates select="table"/>
> ...
>
> <xsl:template match="table"/>
> <xsl:template match="table[key('uTables',@name)]">
> ...
> </xsl:template>
> Jak widac da sie. Co wiecej, nazwa klucza jest /concat'owalnym/ stringiem.
> Co mozna wykorzystac do quasi-dynamicznego parametryzowania wywolan ;)
to to niegłupie jest, zwłaszcza że kilka razy brakowało możliwości zapodania
wyrażenia xpath w xsl:template match'u, a tą drogą w sumie można to
osiągnąć.
kombinuję tylko jak sensownie iść krok dalej:
<xsl:key name="uTables" match="/data/usages/usage" use="@table"/>
<xsl:key name="uTab1" .../>
<xsl:key name="uTab2" .../>
<xsl:template match="table[key(STARTS-WITH('uTab'),@name)]">
--
td
Re: XSLT wybranie node'ów odpowiadających innym node'om
Author: TOUDIdel
Date: Sun, 16 Mar 2008 01:01
Date: Sun, 16 Mar 2008 01:01
11 lines
1662 bytes
1662 bytes
Użytkownik "szomiz" <szomiz@kocha.dostawac.reklamy.przez.net> napisał w wiadomości news:frbdm7$7f4$1@atlantis.news.neostrada.pl... > Niedawno pisalem: nie mam nic przeciwko walce z bezrobociem, tylko > dlaczego w krajach, w ktorych produkuje sie procesory i pamieci. a tu sie zdziwisz ale i u nas niedaleko działa jedna z najnowocześniejszych w świecie linii do produkcji RAM'ow ;) http://www.goodram.com/22 -- td
Re: XSLT wybranie node'ów odpowiadających innym node'om
Author: szomiz
Date: Sun, 16 Mar 2008 07:33
Date: Sun, 16 Mar 2008 07:33
14 lines
1692 bytes
1692 bytes
Użytkownik "TOUDIdel" <toudidel@oDWA.pl> napisał w wiadomości
news:frhrv6$3bk$1@nemesis.news.neostrada.pl...
> kombinuję tylko jak sensownie iść krok dalej:
>
> <xsl:key name="uTables" match="/data/usages/usage" use="@table"/>
> <xsl:key name="uTab1" .../>
> <xsl:key name="uTab2" .../>
> <xsl:template match="table[key(STARTS-WITH('uTab'),@name)]">
Tutaj akurat srednio sensownie. Ale przy tworzeniu plikow indeksowych do
wyszukiwania czy to pelnotekstowego, czy po sciezkach jest jak znalazl.
sz.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads