Avatar billede martinmmn Nybegynder
14. august 2005 - 23:58 Der er 22 kommentarer og
1 løsning

loop i loop

Jeg har denne XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="cinemazone_katalog2.xsl"?>
<A>
<B>
<C>1</c>
<D>2</d>
<E><f><g>11</g><h>11a</h><i>11b</i></f>
<f><g>22</g><h>22a</h><i>22b</i></f></E>
</B>
</A>

Jeg vil gerne have resultat i semikolon separeret fil:

1;2;11;11a;11b
1;2;22;22a;22b

I XML'en kan der være fra nul til mange af <f></f> i <E></E>
Jeg har forsøgt mig med flere varianter af for-each i XSL, uden held.

Er der nogen der har et bud på en XSL, der opfylder kravet?
Avatar billede nielle Nybegynder
15. august 2005 - 07:53 #1
Har du mulighed for at lave XML-strukturen om? Som XML er tænkt er der ikke nogen indlysende sammenhæng mellem din C-tag og 1. child-node i din E-tag, og heller ikke mellem D-taggen og den 2. child-node; Det kunne lige så godt tænkes at de var totalt uafhængige og blot stod i samme rækkefølge.

Mulighederne er mange, men et alternativ til:

<B>
    <C>1</c>
    <D>2</d>
    <E>
        <f>
            <g>11</g>
            <h>11a</h>
            <i>11b</i>
        </f>
        <f>
            <g>22</g>
            <h>22a</h>
            <i>22b</i>
        </f>
    </E>
</B>

- kunne jo være:

<B>
    <C attributNavn="1">
        <f>
            <g>11</g>
            <h>11a</h>
            <i>11b</i>
        </f>
    </c>
    <D attributNavn="2">
        <f>
            <g>22</g>
            <h>22a</h>
            <i>22b</i>
        </f>
    </d>
</B>

Husk på at XML mere er tænkt til at blive læst og fortolket af programmer end af menneskeøjne. I det givne tilfælde er det problematisk at loope over child-nodsene i B-noden idet disse skal behandles forskelligt.
Avatar billede martinmmn Nybegynder
15. august 2005 - 11:37 #2
Jeg vil kunne ændre XML'en. Informationern i <f> skal jo knyttes op på både <C> og <D> så resultatet bliver
1;2;11;11a;11b
1;2;22;22a;22b

Kan du hjælpe med et bud på XSL'en til dit forslag så?
Avatar billede nielle Nybegynder
15. august 2005 - 12:40 #3
Ja, det skulle nok kunne lade sig gøre. Desværre bare ikke lige nu, idet jeg skal ud af døren. :^|

Jeg kigger på det i morgen, hvis der da ellers ikke er nogen andre som har løst den i mellemtiden. :^)
Avatar billede martinmmn Nybegynder
15. august 2005 - 16:26 #4
Hej nielle,

Jeg kan alligevel ikke få rettet XML'en.
Kan du se, om der overhovedet er en løsning alligevel.
Jeg skal bruge data i en database.
Evt. kan man lave udtræk til flere tabeller.
Én tabel med <C> og <g> (hoveID med subID, så at sige)
En anden tabel med <g>, <h> og <i> (indhold for <f>)
En tredje tabel med <C> og <D>.

Så vil der være en relation mellem tabellerne.
Hvad siger du?
Avatar billede softspot Forsker
15. august 2005 - 21:01 #5
Hvormange C og D-noder kan der være?

Jeg vil umiddelbart mene at du skal ud i noget rekursion (en meget nyttig teknik i XSL i øvrigt :)). Jeg skal bare lige have lidt mere info om reglerne for dit XML.
Avatar billede martinmmn Nybegynder
15. august 2005 - 23:44 #6
Der er en del C og D-noder.

Du får her den fulde version ;-)
<?xml version="1.0" encoding="ISO-8859-1"?>
<films>
    <film>
        <id>1111</id>
        <title>Surviving Christmas</title>
        <synopsis><![CDATA[Drew Latham, har ikke nogen familie, så i de ensomme juledage, overtaler en stakkels uvidende familie til at forestille HANS familie. Det skulle de aldrig have gjort]]></synopsis>
        <directors>
            <person>
                <personid>12</personid>
                <name>Mike Mitchell</name>
                <role></role>
            </person>
        </directors>
        <scriptwriters>
            <person>
                <personid>24</personid>
                <name>Deborah Kaplan</name>
                <role></role>
            </person>
            <person>
                <personid>25</personid>
                <name>Harry Elfont</name>
                <role></role>
            </person>

        </scriptwriters>
        <actors>
            <person>
                <personid>13</personid>
                <name>Ben Affleck</name>
                <role>Drew Latham</role>
            </person>
            <person>
                <personid>46</personid>
                <name>Christina Applegate</name>
                <role>Alicia Valco</role>
            </person>
            <person>
                <personid>56</personid>
                <name>James Gandolfini</name>
                <role>Tom Valco</role>
            </person>

        </actors>
        <producers>
            <person>
                <personid>1451</personid>
                <name>Betty Thomas</name>
                <role></role>
            </person>
            <person>
                <personid>1452</personid>
                <name>Jenno Topping</name>
                <role></role>
            </person>
        </producers>
        <photographers>
            <person>
                <personid>21</personid>
                <name>Peter Lyons Collister</name>
                <role></role>
            </person>
            <person>
                <personid>66</personid>
                <name>Tom Priestley Jr</name>
                <role></role>
            </person>
        </photographers>
        <cutters>
            <person>
                <personid>55</personid>
                <name>Craig McKay</name>
                <role></role>
            </person>
        </cutters>
        <composers>
            <person>
                <personid>7</personid>
                <name>Randy Edelman</name>
                <role></role>
            </person>
        </composers>
        <genre>Komedie</genre>
        <originaltitle>Surviving Christmas</originaltitle>
        <productionyear>2004</productionyear>
        <cinemadate>2004-12-10</cinemadate>
        <image1>billede4556.jpg</image1>

    </film>
</films>
Avatar billede softspot Forsker
16. august 2005 - 00:08 #7
og et konkret eksempel på hvordan du vil have data ud pga. de data du har vist til sidst kunne være...?

1111;Surviving Christmas;12;Mike Mitchell;
1111;Surviving Christmas;24;Deborah Kaplan;
1111;Surviving Christmas;25;Harry Elfont;
1111;Surviving Christmas;13;Ben Affleck;Drew Latham

osv... eller hvad?
Avatar billede atoft Nybegynder
16. august 2005 - 09:02 #8
Prøv med dette her.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <xsl:apply-templates select="films/film"/>
    </xsl:template>
    <xsl:template match="film">
        <xsl:apply-templates select="//person">
            <xsl:with-param name="id" select="id"/>
            <xsl:with-param name="title" select="title"/>
        </xsl:apply-templates>
    </xsl:template>
    <xsl:template match="person">
        <xsl:param name="id"/>
        <xsl:param name="title"/>
        <xsl:value-of select="$id"/>;<xsl:value-of select="$title"/>;<xsl:value-of select="personid"/>;<xsl:value-of select="name"/>;<xsl:value-of select="role"/><xsl:text>
</xsl:text>
    </xsl:template>
</xsl:stylesheet>
Avatar billede martinmmn Nybegynder
16. august 2005 - 09:34 #9
softspot:
Du har ret.
1111;Surviving Christmas;12;Mike Mitchell;
1111;Surviving Christmas;24;Deborah Kaplan;
1111;Surviving Christmas;25;Harry Elfont;
1111;Surviving Christmas;13;Ben Affleck;Drew Latham

atoft:
Jeg har prøvet. Det ser fornuftigt ud. Dog kommer det i én lang streng. Hvordan laves linieskift ved hvert <id> så resultatet fremstår som under min kommentar til softspot?
Avatar billede atoft Nybegynder
16. august 2005 - 10:08 #10
Det er <xsl:text> elementer som skal lave linieskiftet derfor er det vigtigt at du har </xsl:text> på en ny linie.
Avatar billede atoft Nybegynder
16. august 2005 - 10:09 #11
altså

<xsl:value-of select="$id"/>;<xsl:value-of select="$title"/>;<xsl:value-of select="personid"/>;<xsl:value-of select="name"/>;<xsl:value-of select="role"/><xsl:text>
<xsl:text>
Avatar billede martinmmn Nybegynder
16. august 2005 - 11:41 #12
Ok, jeg er med på linieskift.
Men jeg har brug for at kunne skelne pr. film og pr. funktion (f.eks. <actors> eller <producers>).

Her nyt XML eksempel med 2 <film>:

<?xml version="1.0" encoding="ISO-8859-1"?>
<films>
    <film>
        <id>1111</id>
        <title>Surviving Christmas</title>
        <synopsis><![CDATA[Drew Latham, har ikke nogen familie, så i de ensomme juledage, overtaler en stakkels uvidende familie til at forestille HANS familie. Det skulle de aldrig have gjort]]></synopsis>
        <directors>
            <person>
                <personid>12</personid>
                <name>Mike Mitchell</name>
                <role></role>
            </person>
        </directors>
        <actors>
            <person>
                <personid>13</personid>
                <name>Ben Affleck</name>
                <role>Drew Latham</role>
            </person>
            <person>
                <personid>46</personid>
                <name>Christina Applegate</name>
                <role>Alicia Valco</role>
            </person>
            <person>
                <personid>56</personid>
                <name>James Gandolfini</name>
                <role>Tom Valco</role>
            </person>
        </actors>
        <producers>
            <person>
                <personid>1451</personid>
                <name>Betty Thomas</name>
                <role></role>
            </person>
            <person>
                <personid>1452</personid>
                <name>Jenno Topping</name>
                <role></role>
            </person>
        </producers>
        <genre>Komedie</genre>
        <originaltitle>Surviving Christmas</originaltitle>
        <productionyear>2004</productionyear>
        <cinemadate>2004-12-10</cinemadate>
        <image1>billede4556.jpg</image1>
    </film>
        <film>
        <id>2222</id>
        <title>Dubie Film</title>
        <synopsis><![CDATA[Dubie]]></synopsis>
        <directors>
            <person>
                <personid>944</personid>
                <name>Joe Instrukt</name>
                <role></role>
            </person>
        </directors>
        <actors>
            <person>
                <personid>644</personid>
                <name>Karoline Skuespil</name>
                <role>Karolines Rolle</role>
            </person>
            <person>
                <personid>744</personid>
                <name>Jens Schauspil</name>
                <role>Jens' Rolle</role>
            </person>
        </actors>
        <producers>
            <person>
                <personid>1244</personid>
                <name>Ususla Ursus</name>
                <role></role>
            </person>
        </producers>
        <genre>Drama</genre>
        <originaltitle>Dubie originalfilm</originaltitle>
        <productionyear>2004</productionyear>
        <cinemadate>2004-04-04</cinemadate>
        <image1>billede4444.jpg</image1>

    </film>
</films>

Her vil jeg gerne kunne få output, der eksempelvis viser <actors> for hver film:

1111;Surviving Christmas;12;Mike Mitchell;
1111;Surviving Christmas;13;Ben Affleck;Drew Latham
1111;Surviving Christmas;46;Christina Applegate;Alicia Valco
1111;Surviving Christmas;56;James Gandolfini;Tom Valco
2222;Dubie Film;644;Karoline Skuespil;Karolines Rolle
2222;Dubie Film;744;Jens Schauspil;Jens' Rolle

Er det muligt?
Avatar billede atoft Nybegynder
16. august 2005 - 12:27 #13
selvfølgelig er det muligt, du laver bare

<xsl:apply-templates select="//person">

om til

<xsl:apply-templates select="//actors/person">

og vil du have producers

<xsl:apply-templates select="//producers/person">
Avatar billede atoft Nybegynder
16. august 2005 - 12:29 #14
Lige til orientering. Du bør ikke angive dine kommentarer som svar. Svar bruges når man kommer med et bud på løsningen på problemet.
Avatar billede martinmmn Nybegynder
16. august 2005 - 13:00 #15
>Du bør ikke angive dine kommentarer som svar. Svar bruges når man kommer med et bud >på løsningen på problemet.

Det var en fejl, beklager.
Avatar billede atoft Nybegynder
16. august 2005 - 13:04 #16
Ja ja der sker jo ikke det store ved det, så du behøver ikke beklage :-)
Avatar billede martinmmn Nybegynder
16. august 2005 - 13:06 #17
OK, nu vælger den kun <actors>, men alle <actors> bliver vist på begge film:

1111;Surviving Christmas;13;Ben Affleck;Drew Latham
1111;Surviving Christmas;46;Christina Applegate;Alicia Valco
1111;Surviving Christmas;56;James Gandolfini;Tom Valco
1111;Surviving Christmas;644;Karoline Skuespil;Karolines Rolle
1111;Surviving Christmas;744;Jens Schauspil;Jens' Rolle
2222;Dubie Film;13;Ben Affleck;Drew Latham
2222;Dubie Film;46;Christina Applegate;Alicia Valco
2222;Dubie Film;56;James Gandolfini;Tom Valco
2222;Dubie Film;644;Karoline Skuespil;Karolines Rolle
2222;Dubie Film;744;Jens Schauspil;Jens' Rolle

Hvordan skiller jeg <actors> ud, så de kun knyttes på på det <id>, de hører til?

1111;Surviving Christmas;12;Mike Mitchell;
1111;Surviving Christmas;13;Ben Affleck;Drew Latham
1111;Surviving Christmas;46;Christina Applegate;Alicia Valco
1111;Surviving Christmas;56;James Gandolfini;Tom Valco
2222;Dubie Film;644;Karoline Skuespil;Karolines Rolle
2222;Dubie Film;744;Jens Schauspil;Jens' Rolle
Avatar billede atoft Nybegynder
16. august 2005 - 13:09 #18
ups ja min fejl :(

<xsl:apply-templates select="//actors/person">

skal laves om til

<xsl:apply-templates select="actors/person">

det samme skal producers selvfølgelig.
Avatar billede atoft Nybegynder
16. august 2005 - 13:10 #19
// søger fra roden af xml documentet.
Avatar billede martinmmn Nybegynder
16. august 2005 - 13:37 #20
Yes! Der var den.
Formidabelt. Takker :-)
Avatar billede atoft Nybegynder
16. august 2005 - 13:46 #21
det var så lidt
Avatar billede nielle Nybegynder
16. august 2005 - 19:07 #22
Sejt :^)
Avatar billede atoft Nybegynder
16. august 2005 - 23:07 #23
Ja xsl er meget smart.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester