Avatar billede el_fredo Praktikant
25. november 2008 - 17:05 Der er 12 kommentarer og
1 løsning

XQuery til at finde ikke-eksisterende navne

Hej.
Jeg har i en XML-fil en række faciliteter som er defineret blandt andet med et unikt navn. Derudover er der nogle rapporter som refererer til disse faciliteter vha. selvsamme navn. Det er vigtigt at der eksisterer en facilitet med det navn som man angiver i rapporten, så det jeg skal er at lave en XQuery der identificerer de steder hvor man har oprettet en rapport der benytter et navn som IKKE er oprettet under en facilitet. Jeg har prøvet mig lidt frem, men er jævnt blank når det kommer til XQueries. Håber der er nogen der kan hjælpe. Jeg har skitseret faciliteter og rapporter herunder. Ønsket er en liste af rapporter der indeholder ikke-eksisterende navne.

<bst:Facilitet>
  <bst:Name>EtNavn</bst:Name>
</bst:Facilitet>
<bst:Facilitet>
  <bst:Name>EtAndetNavn</bst:Name>
</bst:Facilitet>

<bst:Rapport>
  <bst:FacilitetNavn>EtNavn</bst:FacilitetNavn>
</bst:Rapport>
Avatar billede el_fredo Praktikant
25. november 2008 - 17:07 #1
Har lige ændret lidt i eksemplet for at gøre det lidt mere overskueligt.

<Facilitet>
  <Navn>Gasværk</Navn>
</Facilitet>
<Facilitet>
  <Navn>Magarinefabrik</Navn>
</Facilitet>

<Rapport>
  <FacilitetNavn>Gasværk</FacilitetNavn>
</Rapport>
Avatar billede jokkejensen Novice
25. november 2008 - 17:29 #2
i xpath ser den sådan her ud:

Rapport[FacilitetNavn/text() = //Facilitet/Navn/text()]
Avatar billede jokkejensen Novice
25. november 2008 - 17:30 #3
.. !=, hvis det skal være liste over rapporter der IKKE har en facilitet.
Avatar billede el_fredo Praktikant
26. november 2008 - 13:51 #4
Ok, jeg har prøvet med !=, men den liste jeg får retur indeholder samtlige rapporter, ikke blot dem som refererer til et ikke-eksisterende navn (i faciliteterne). Jeg formoder at "//Facilitet/Navn/text()" giver samtlige noder der eksisterer af den slags, og at "FacilitetNavn/text()" holdes op mod hvert af disse elementer for at se om den eksisterer.

Hvordan kan jeg justere den så den kun returnerer de rapporter der refererer ikke-eksisterende navne fremfor samtlige rapporter?
Avatar billede jokkejensen Novice
26. november 2008 - 14:54 #5
du får lige mit test: (jeg har erstattet != med not())

    <xsl:template match="/">
        <xsl:variable name="temp">
            <xml>
                <Facilitet>
                    <Navn>Gasværk</Navn>
                </Facilitet>
                <Facilitet>
                    <Navn>Magarinefabrik</Navn>
                </Facilitet>
                <Rapport>
                    <FacilitetNavn>Gasværk</FacilitetNavn>
                </Rapport>
            </xml>
        </xsl:variable>
        <xsl:apply-templates select="msxml:node-set($temp)/xml/Rapport[not(FacilitetNavn/text() = /xml//Facilitet/Navn/text())]"></xsl:apply-templates>
    </xsl:template>

    <xsl:template match="Rapport">
        <xsl:value-of select="FacilitetNavn"/>
    </xsl:template>


Jeg ligger lige <faciliteter> og <rapporter> sammen med en node der hedder xml for at kunne bearbejde, jeg bruger msxml:node-set() til at lave min variable streng om til et xml nodeset..

Du kan godt have 2 xml kilder, brug msxsl:document.

Sig til hvis det driller.
Avatar billede jokkejensen Novice
26. november 2008 - 14:55 #6
msxml:node-set($temp) svarer altså til / på variablen temp.
Avatar billede el_fredo Praktikant
26. november 2008 - 15:03 #7
Ok, jeg prøver lige at konvertere dit eksempel til XQuery syntax og teste det, heldigvis er XPath og XQuery en del af samme kage :)

På forhånd tak.
Avatar billede el_fredo Praktikant
26. november 2008 - 15:09 #8
Kan det i øvrigt løses uden at benytte variable-name="temp"? Det ville være bedst hvis jeg helt kunne undgå at redigere i input filen.
Avatar billede el_fredo Praktikant
26. november 2008 - 15:10 #9
Med input filen mener jeg i øvrigt den hvor rapporter og faciliteter er placeret :)
Avatar billede el_fredo Praktikant
26. november 2008 - 15:24 #10
Arg hvor er det irriterende jeg ikke kan redigere tidligere indlæg :@
En kort bemærkning: Jeg får data ind (dvs. filen med rapporter, faciliteter osv.) i en variabel der hedder $source_url. Har desværre ingen mulighed for at ændre i selve source-filen hvor Facilitet og Rapport ligger. Alle søgninger osv. skal foregå i min XQuery.
Avatar billede el_fredo Praktikant
26. november 2008 - 16:13 #11
Jokke, så kan du bare sende et svar. Jeg brugte en lille del af dit eksempel og fik løst problemet. Det var præcist det med at bruge not i stedet for != der gjorde forskellen.
Avatar billede jokkejensen Novice
01. december 2008 - 10:31 #12
Lad os dele, og sorry for jeg ikke lige har vendt tilbage tidligere :O)
Avatar billede el_fredo Praktikant
01. december 2008 - 10:42 #13
Det er ok, jeg fik løst problemet med din hjælp - det er de fulde points værd.

Tak
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