Avatar billede dasch87 Nybegynder
04. november 2008 - 22:32 Der er 4 kommentarer og
1 løsning

Problemer med transformering af XML

Hej Eksperter
Jeg har lidt problemer med at få transformeret en xml fil til en anden.
Jeg har en fil med informationer omkring skuespillere og for hver film skuespilleren har været med i optræder han en gang. Se sample her:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="xsl2.xslt"?>
<actorlist>
<actor>
  <firstname>Angel</firstname>
  <lastname>11:11</lastname>
  <movie>Zoolander</movie>
  <year>2001</year>
  <character>Funky Loft Guest</character>
</actor>
<actor>
  <firstname>Nick</firstname>
  <lastname>13</lastname>
  <movie>Inland Empire</movie>
  <year>2006</year>
  <character>Archaeologist</character>
</actor>
<actor>
  <firstname>Yet</firstname>
  <lastname>Another</lastname>
  <movie>Malcolm X</movie>
  <year>1972</year>
  <character>SerialKiller</character>
</actor>
<actor>
  <firstname>The</firstname>
  <lastname>5.6.7.8&apos;s</lastname>
  <movie>Get Rich or Die Tryin&apos;</movie>
  <year>2005</year>
  <character>Marcus</character>
</actor>
<actor>
  <firstname>James</firstname>
  <lastname>52X</lastname>
  <movie>Malcolm X</movie>
  <year>1972</year>
  <character>Himself</character>
</actor>
<actor>
  <firstname>Dude</firstname>
  <lastname>Cool</lastname>
  <movie>Malcolm X</movie>
  <year>1972</year>
  <character>SerialKiller</character>
</actor>
</actorlist>

Jeg skal have lavet en XSLT fil som transformerer dette til en xml fil som lister hver film samt hvilke skuespillere som har være med id den. Hver film skal kun være listet en gang.
Jeg har prøvet med lidt forskelligt med noget count og noget, men kan ikke få det til at virke.
Jeg har fået lavet noget men får kun et tekst output ikke som en xml fil., nogen der kan hjæpe mig med det? Men i hvert fald får jeg ikke hver film kun en gang. Her er hvad jeg har:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <movies>
        <xsl:for-each select="actorlist/actor">
            <movie>
                <title><xsl:value-of select="movie"/></title>
                <year><xsl:value-of select="year"/></year>
                <xsl:variable name="currentmovie"><xsl:value-of select="movie"/></xsl:variable>

                <xsl:for-each select="/actorlist/actor">
                    <xsl:if test="$currentmovie = movie">
                    <actor>
                        <Firstname><xsl:value-of select="firstname"/></Firstname>
                        <Lastname><xsl:value-of select="lastname"/></Lastname>
                        <Character><xsl:value-of select="character"/></Character>
                    </actor>
                    </xsl:if>
                </xsl:for-each>
            </movie>
        </xsl:for-each>
        </movies>
    </xsl:template>
</xsl:transform>

Jeg vil gerne have en løsning som fungerer. Arbejd gerne videre på dette men jeg er også åben for en en helt anden løsning.
Please hjælp:D

På forhånd tak.

/Dasch
Avatar billede jokkejensen Novice
05. november 2008 - 09:51 #1
<xsl:template match="/">
    <xsl:variable name="Source">
      <actorlist>
        <actor>
          <firstname>Angel</firstname>
          <lastname>11:11</lastname>
          <movie>Zoolander</movie>
          <year>2001</year>
          <character>Funky Loft Guest</character>
        </actor>
        <actor>
          <firstname>Nick</firstname>
          <lastname>13</lastname>
          <movie>Inland Empire</movie>
          <year>2006</year>
          <character>Archaeologist</character>
        </actor>
        <actor>
          <firstname>Yet</firstname>
          <lastname>Another</lastname>
          <movie>Malcolm X</movie>
          <year>1972</year>
          <character>SerialKiller</character>
        </actor>
        <actor>
          <firstname>The</firstname>
          <lastname>5.6.7.8&apos;s</lastname>
          <movie>Get Rich or Die Tryin&apos;</movie>
          <year>2005</year>
          <character>Marcus</character>
        </actor>
        <actor>
          <firstname>James</firstname>
          <lastname>52X</lastname>
          <movie>Malcolm X</movie>
          <year>1972</year>
          <character>Himself</character>
        </actor>
        <actor>
          <firstname>Dude</firstname>
          <lastname>Cool</lastname>
          <movie>Malcolm X</movie>
          <year>1972</year>
          <character>SerialKiller</character>
        </actor>
      </actorlist>
    </xsl:variable>

    <xsl:apply-templates select="msxml:node-set($Source)/actorlist/actor/movie[not(text()=preceding::movie/text())]"></xsl:apply-templates>


  </xsl:template>

  <xsl:template match="movie">
    <xsl:variable name="CurrentMovie" select="./text()"/>
    <h1>Film</h1>
    <xsl:value-of select="$CurrentMovie"/>
    <h2>Skuespillere</h2>
    <xsl:apply-templates select="/actorlist/actor[movie=$CurrentMovie]"/>
    <br></br>
  </xsl:template>

  <xsl:template match="actor">
    <xsl:value-of select="concat(firstname, ' ', lastname)"/>
    <br></br>
  </xsl:template>

Giver:

Film
Zoolander
Skuespillere
Angel 11:11


Film
Inland Empire
Skuespillere
Nick 13


Film
Malcolm X
Skuespillere
Yet Another
James 52X
Dude Cool


Film
Get Rich or Die Tryin'
Skuespillere
The 5.6.7.8's
Avatar billede jokkejensen Novice
06. november 2008 - 13:11 #2
.. Du siger bare til hvis det driller..

Vh.
Avatar billede dasch87 Nybegynder
10. november 2008 - 10:47 #3
hmn jeg er ikke helt med tror jeg., benytter du al dataen som en del af dit xslt? så vidt jeg kan se indkorporerer du noget template i selve xml dataen?

Kan det laves sådan så jeg har en seperat xslt fil, som jeg refererer til i min xml fil med noget lignenede:
<?xml-stylesheet type="text/xsl" href="xsl2.xslt"?>

Sådan så jeg ikke skal ændre noget i den originale xml fil?
Eller er det bare mig som ikke lige kan finde ud af det?

Tak for din hjælp.!
Avatar billede jokkejensen Novice
10. november 2008 - 14:19 #4
bare skriv det her i din xslt:

<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">

    <xsl:apply-templates select="/actorlist/actor/movie[not(text()=preceding::movie/text())]"></xsl:apply-templates>


  </xsl:template>

  <xsl:template match="movie">
    <xsl:variable name="CurrentMovie" select="./text()"/>
    <h1>Film</h1>
    <xsl:value-of select="$CurrentMovie"/>
    <h2>Skuespillere</h2>
    <xsl:apply-templates select="/actorlist/actor[movie=$CurrentMovie]"/>
    <br></br>
  </xsl:template>

  <xsl:template match="actor">
    <xsl:value-of select="concat(firstname, ' ', lastname)"/>
    <br></br>
  </xsl:template>
</xsl:transform>


Jeg tager lige forbehold for små fejl, men det skulle virke som beskrevet.

Mit første eksempel tager bare udgangspunkt i en variable med et nodeset, frem for en ekstern kilde, beklager hvis det har forvirret mere end det har gavnet.

Hvis du har problemer med at transformere det til xml, skal jeg nok lige se på det igen, jeg fik ikke lige læst spørgsmålet, men det er mere eller mindre bare at bruge <xsl:copy-of select="." /> i movie og actor templaten.

/J
Avatar billede dasch87 Nybegynder
10. november 2008 - 15:12 #5
Jo det kunne sagtens bruges.., mange tak for dit svar:D
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