Avatar billede sse77 Nybegynder
02. januar 2006 - 08:53 Der er 14 kommentarer og
1 løsning

Udvælge linier

Hej,

Er det muligt at lave en betingelse i sin XSL som bestemmer om nogle linier som gik forud for det tag som betingelsen skal tjekke medtages i det nye XML dokument?
Avatar billede Slettet bruger
04. januar 2006 - 10:55 #1
Højst sandsynligt - men kan du præcisere lidt mere hvad du gerne vil?

/CS
Avatar billede sse77 Nybegynder
04. januar 2006 - 11:14 #2
Eksempel xml dokument:

<navn>Georg<\navn>
<efternavn>Nielsen<\efternavn>
<afdeling>HR<\afdeling>
<medarbejdernr>5867<\medarbejdernr>

Der vil jeg gerne have navn,efternavn,afdeling medtaget i nyt xml dokument, såfremt medarbejdernr er større end 5000. Altså betingelsen skal tjekke på noget længere nede end det, som skal medtages.
Avatar billede Slettet bruger
04. januar 2006 - 11:47 #3
OK - hvis nu ovenstående data er wrapped i et <medarbejder> element, så laver du en generel template der piller det ud der skal med i output:

<xsl:template match="medarbejder">
  <xsl:copy-of select="." /> <!-- Kopierer bare alt -->
</xsl:template>

og laver betingelsen der hvor du kalder apply-templates, f.eks. i rod-template'en:

<xsl:template match="/">
  <medarbejdere>
      <xsl:apply-templates select="//medarbejder[medarbejdernr &gt; 5000] />
  </medarbejdere>
</xsl:template>

/CS
Avatar billede Slettet bruger
04. januar 2006 - 11:48 #4
Ups - mangler et anførselstegn

...
<xsl:apply-templates select="//medarbejder[medarbejdernr &gt; 5000]" />
...

/CS
Avatar billede sse77 Nybegynder
04. januar 2006 - 13:26 #5
Jeg har skrevet følgende stylesheet men der viser ikke noget i det "nye" xml dokument.

<?xml version="1.0" encoding="UTF-8"?>
<?xmlspysamplexml I:\businessconnector\maskeDocuments\OSREG416.ORDRSP-SND8.xml?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:template match="/">
        <xsl:apply-templates select="//HEAD"/>
        <xsl:apply-templates select="//medarbejder[medarbejdernr &gt; 0]"/>
    </xsl:template>
    <xsl:template match="HEAD">
        <xsl:copy-of select="."/>
    </xsl:template>
    <xsl:template match="LINE">
        <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>
Avatar billede sse77 Nybegynder
04. januar 2006 - 13:28 #6
template match="LINE" er template match="medarbejder"
Avatar billede sse77 Nybegynder
04. januar 2006 - 15:09 #7
Okay det var min editor, der gjorde at det ikke virkede, nu prøvede jeg med en andet xsl editor og der kopierer den hele skidtet, og ikke kun de medarbejdere som indeholder medarbejdernr større end 5000.
Avatar billede Slettet bruger
04. januar 2006 - 23:50 #8
Der er et par ting der er værd at vide:

* copy-of kopierer HELE træet fra den valgte node (inkl. underelementer og attributter). Hvis dine <medarbejder> elementer ligge inde i <HEAD> bliver de altså kopieret med allerede i den template der matcher HEAD.

* I koden bruger du 0 i stedet for 5000 !!!

/CS
Avatar billede sse77 Nybegynder
05. januar 2006 - 08:39 #9
Ja det forklarer jo det med hele træet der bliver kopieret over. Med hensyn til brug af 0 så er det ikke forkert, det andet var bare en eksempel på det jeg ønskede at kunne :). Det vil sige jeg skal finde en måde hvorpå den kun kopierer ned til <medarbejder> når det står inde under <HEAD>. Er det muligt?
Avatar billede Slettet bruger
05. januar 2006 - 10:06 #10
Yep - det er det man har templates til.
Du kan f.eks. gøre flg.:

<xsl:template match="HEAD">
  <xsl:copy-of select="ELEMENT1 | ELEMENT2"/>
</xsl:template>

Hvilket kun kopierer <ELEMENT1> og <ELEMENT2>

/CS
Avatar billede sse77 Nybegynder
05. januar 2006 - 10:27 #11
Som du nok har regnet ud er jeg ikke så erfaren i XSL, så jeg undskylder mange gange for mine fortsatte spørgsmål, og jeg sætter stor pris på din tålmodighed.
Er der ikke en måde hvorpå du bare kopierer uden at vide hvor mange eller hvilke elementer der findes i <HEAD>?
Avatar billede Slettet bruger
05. januar 2006 - 10:57 #12
Naturligvis, og så er vi ovre i den "rigtige" måde at bruge XSLT templates på...

Fidusen er at lave en generel template der kopierer et element og dets attributter, og derefter "fortsætter" med underelementer (vha. apply-templates) - de elementer der kræver særbehandling laver man så specifikke templates til.

<xsl:template match="* | @*">
  <xsl:copy>
      <xsl:apply-templates select="* | @*" />
  </xsl:copy>
</xsl:template>

<xsl:template match="medarbejder[medarbejdernr &lt; 0]" /><!-- Tom template; medarbejdere med negativt nr kommer ikke med ud -->

osv.

/CS
Avatar billede sse77 Nybegynder
05. januar 2006 - 12:49 #13
Det ser ud til vi er ved at være i mål, der er dog et enkelt problem og jeg kunne sikkert løse det hvis jeg 100% forstod hvad * | @* gør. Du kan lige se hvad jeg har lavet indtil videre.

Xml der skal transformeres:

<?xml version="1.0" encoding="UTF-8"?>
<HEAD>
    <FIRMA>Firmanavn</FIRMA>
    <ADRESSE>Industrivej Syd 2</ADRESSE>
    <Postkasse>8200 DK Aarhus</Postkasse>
    <Medarbejder>
        <Fornavn>Georg</Fornavn>
        <Efternavn>Jensen</Efternavn>
        <Afdeling>HR</Afdeling>
        <Medarbejdernr>5000</Medarbejdernr>
    </Medarbejder>
    <Medarbejder>
        <Fornavn>Niels</Fornavn>
        <Efternavn>Jensen</Efternavn>
        <Afdeling>Aspect4</Afdeling>
        <Medarbejdernr>4999</Medarbejdernr>
    </Medarbejder>
</HEAD>

Stylesheet:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="* | @*">
        <xsl:copy>
            <xsl:apply-templates select="* | @*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Medarbejder[Medarbejdernr &lt; 5000]"/>
</xsl:stylesheet>

ResultatXml :

<?xml version="1.0" encoding="UTF-16"?>
<HEAD>
    <FIRMA></FIRMA>
    <ADRESSE></ADRESSE>
    <Postkasse></Postkasse>
    <Medarbejder>
        <Fornavn></Fornavn>
        <Efternavn></Efternavn>
        <Afdeling></Afdeling>
        <Medarbejdernr></Medarbejdernr>
    </Medarbejder>
</HEAD>

Som du kan se så mangler der at komme infomationer med over i resultatdokumentet, ellers tager den jo rigtigt nok kun den ene af de 2 medarbejdere.
Avatar billede Slettet bruger
05. januar 2006 - 13:01 #14
hehe - whooops, som de siger :-)

Erstat "* | @*" med "@* | node()" - så får du det hele med.

/CS
Avatar billede sse77 Nybegynder
05. januar 2006 - 13:19 #15
Yes, nu virker det lige som jeg gerne vil have det til. Du skal have mange tak for hjælpen.
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