🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

4 total messages Started by Krzysiek Thu, 21 Jun 2007 12:53
xslt intersection
#9335
Author: Krzysiek
Date: Thu, 21 Jun 2007 12:53
50 lines
2120 bytes
Witam.
Chciałem otrzymać te węzły B, które są wspólne dla obydwóch węzłów A.
Mam taki plik xml:

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

<doc>
    <A>w elA1
       <B>elB1</B>
       <B>elB2</B>
       <B>elB3</B>
    </A>
    <A>w elA2
       <B>elB1</B>
       <B>elB3</B>
       <B>elB4</B>
    </A>
</doc>

i taki plik transformacji:

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

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output indent="yes" method="xml"/>
	<xsl:template match="/">
		<xsl:call-template name="aaa"/>
	</xsl:template>
	<xsl:template name="aaa">
		<xsl:param name="node-set1" select="//A[1]/B"/>
		<xsl:param name="node-set2" select="//A[2]/B"/>
		A1:		<xsl:apply-templates select="$node-set1"/>
		A2:		<xsl:apply-templates select="$node-set2"/>
		Przecięcie		<xsl:apply-templates select="$node-set1[count(. | 
$node-set2) = count($node-set2)]"/>
	</xsl:template>
	<xsl:template match="B">
	w B[		<xsl:value-of select="position()"/>
]	</xsl:template>
</xsl:stylesheet>

A wynik jaki otrzymuję to:

A1: w B[ 1 ] w B[ 2 ] w B[ 3 ] A2: w B[ 1 ] w B[ 2 ] w B[ 3 ] Przecięcie

Jak widać nie udaje mi się znaleźć części wspólnej. Czy ktoś ma pomysł 
gdzie popełniem błąd? Będę wdzięczny za każdą pomoc.

Krzysiek.
Re: xslt intersection
#9336
Author: szomiz
Date: Thu, 21 Jun 2007 13:40
18 lines
1596 bytes
Użytkownik "Krzysiek" <kawu1@fm.pl> napisał w wiadomości 
news:f5dsko$jk4$1@atlantis.news.tpi.pl...

Strasznie przekombinowales...

    <xsl:apply-templates select="A[1]/B" mode="comp"/>

<xs:template match="B" mode="comp">
    <xsl:variable name="A2" select="../../A[2]/B[text()=current()/text()]"/>
    <xsl:if test="count($A2)!=0">
        <xsl:value-of select="."/>:
        A[1]/B[<xsl:value-of select="count(preceding-sibling::A) +1"/>]
        A[2]/B[<xsl:value-of select="count($A2/preceding-sibling::A) +1"/>],
    ...

Calosc przy zalozeniu, ze wewnatrz kazdego A wartosci w B sa unikalne.

sz. 
Re: xslt intersection
#9337
Author: Krzysiek
Date: Fri, 22 Jun 2007 17:34
25 lines
1850 bytes
szomiz pisze:
> U�ytkownik "Krzysiek" <kawu1@fm.pl> napisa� w wiadomo�ci 
> news:f5dsko$jk4$1@atlantis.news.tpi.pl...
> 
> Strasznie przekombinowales...
> 
>     <xsl:apply-templates select="A[1]/B" mode="comp"/>
> 
> <xs:template match="B" mode="comp">
>     <xsl:variable name="A2" select="../../A[2]/B[text()=current()/text()]"/>
>     <xsl:if test="count($A2)!=0">
>         <xsl:value-of select="."/>:
>         A[1]/B[<xsl:value-of select="count(preceding-sibling::A) +1"/>]
>         A[2]/B[<xsl:value-of select="count($A2/preceding-sibling::A) +1"/>],
>     ...
> 
> Calosc przy zalozeniu, ze wewnatrz kazdego A wartosci w B sa unikalne.
> 
> sz. 
> 
> 
Dzięki za pomoc. Oczywiście rozwiązanie jak najbardziej spełnia moje 
oczekiwania. A tak swoją drogą jestem ciekaw czemu w rozwiązanie które 
przedstawiłem nie działało (ten sposób na znalezienie części wspólnej 
zaczerpnąłem z książki).
Re: xslt intersection
#9338
Author: szomiz
Date: Sat, 23 Jun 2007 04:26
16 lines
1546 bytes
Użytkownik "Krzysiek" <kawu1@fm.pl> napisał w wiadomości 
news:f5h1nh$j5m$1@nemesis.news.tpi.pl...

> oczekiwania. A tak swoją drogą jestem ciekaw czemu w rozwiązanie które 
> przedstawiłem nie działało (ten sposób na znalezienie części wspólnej

 select="$node-set1[count(. | $node-set2) = count($node-set2)]"

Przy tak zdefiniowanych zmiennych nie zwroci niczego sensownego. Sprobuj 
sobie /opowiedziec/ to wyrazenie.

> zaczerpnąłem z książki).

Ale chyba nie w calosci.

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