🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

10 total messages Started by zbyszek malec Thu, 13 Mar 2008 12:02
XSLT wybranie node'ów odpowiadających innym node'om
#9753
Author: zbyszek malec
Date: Thu, 13 Mar 2008 12:02
31 lines
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
#9754
Author: szomiz
Date: Thu, 13 Mar 2008 12:15
50 lines
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
#9755
Author: zbyszek malec
Date: Thu, 13 Mar 2008 13:18
71 lines
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
#9756
Author: szomiz
Date: Thu, 13 Mar 2008 13:43
38 lines
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
#9757
Author: zbyszek malec
Date: Thu, 13 Mar 2008 13:53
35 lines
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
#9758
Author: zbyszek malec
Date: Thu, 13 Mar 2008 14:11
24 lines
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]) &gt; 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
#9759
Author: szomiz
Date: Thu, 13 Mar 2008 14:27
35 lines
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]) &gt; 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
#9761
Author: TOUDIdel
Date: Sun, 16 Mar 2008 00:58
29 lines
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
#9760
Author: TOUDIdel
Date: Sun, 16 Mar 2008 01:01
11 lines
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
#9762
Author: szomiz
Date: Sun, 16 Mar 2008 07:33
14 lines
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