xslt anfängerfrage: parent/ancestor etc.

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • xslt anfängerfrage: parent/ancestor etc.

    Hi -- ich bin völlig unbedarft in Sachen xml/xslt ( das betrifft leider auch die xsl-Terminologie, sorry!) Es geht um xml-Import in eine Datenbank (FileMaker) und ich stehe hier aktuell mit einem einstmals für mich angefertigten Stylesheet, welches ich zu adaptieren habe, was mir bisher nur teilweise geglückt ist. Ich hoffe ich kann mein Problem deutlich machen .. hier zunächst ein Auszug aus der xml-Datei:

    Quellcode

    1. <file name="xy.doc" guid="0cb0da0b-70b8-426c-88eb-6c55e41906be">
    2. <analyse>
    3. <perfect segments="0" words="0" characters="0" placeables="0" />
    4. <inContextExact segments="4" words="4" characters="7" placeables="3" />
    5. <exact segments="5" words="14" characters="19" placeables="32" />
    6. <repeated segments="1" words="2" characters="4" placeables="6" />
    7. <total segments="15" words="33" characters="56" placeables="88" />
    8. <new segments="1" words="1" characters="2" placeables="0" />
    9. <fuzzy min="50" max="74" segments="1" words="3" characters="4" placeables="9" />
    10. <fuzzy min="75" max="84" segments="2" words="7" characters="16" placeables="32" />
    11. <fuzzy min="85" max="94" segments="0" words="0" characters="0" placeables="0" />
    12. <fuzzy min="95" max="99" segments="1" words="2" characters="4" placeables="6" />
    13. </analyse>
    14. </file>
    Alles anzeigen


    Aufgabe ist es das Attribut 'words' aus allen Zeilen unterhalb <analyse> zu extrahieren. Das klappt im Prinzip auch, aber das Problem sind die vier <fuzzy..> Zeilen, die ich bisher versucht habe in einem separaten Importvorgang zu extrahieren - auch das gelingt, aber dann wiederum gelingt es mir nicht in die importierten fuzzy-Datensätze die <file guid> mitzunehmen (die zwei Ebenen höher liegt) ... ich denke das müsste mit parent oder ancestor möglich sein ?!. Wie genau lautet der Code dafür? Hier mein Ansatz:

    Quellcode

    1. <xsl:for-each select="task/file/analyse/fuzzy">
    2. <ROW MODID="1" RECORDID="1">
    3. <COL><DATA><xsl:value-of select="parent/parent/@guid"/></DATA></COL>
    4. <COL><DATA><xsl:value-of select="@min"/></DATA></COL>
    5. <COL><DATA><xsl:value-of select="@max"/></DATA></COL>
    6. <COL><DATA><xsl:value-of select="@words"/></DATA></COL>
    7. </ROW>


    Ist die Idee als solche richtig, oder sollte man das ganz anders machen? Besser wäre natürlich alles in einem Rutsch zu importieren, aber ich sehe nicht, wie ich dabei alle <fuzzys> mit reinbekomme... vielen Dank für jede Hilfe -- jo
  • d0nut schrieb:

    Hallo

    hm, warum brauchst du zwei Schleifendurchläufe? Ich meine warum sind die fuzzys nicht beim ersten Selektor dabei? Wie sieht deine erste foreach aus?
    task/file/analyse/* müsste doch alle Kindknoten von Analyse auslesen und du bekommst alle "words"


    Zwei Importvorgänge, weil: wenn ich die anderen tags (new / total etc.) abfrage, bekomme ich immer nur das erste der fuzzy-tags mit rüber?!

    Wie dem auch sei, mir wurde von anderer Seite inzwischen eine Lösung gesteckt, die schaut (für den 2. Importvorgang) so aus:

    <RESULTSET>
    <xsl:attribute name="FOUND">1</xsl:attribute>
    <xsl:for-each select="//fuzzy">
    <ROW>
    <xsl:attribute name="MODID">0</xsl:attribute>
    <xsl:attribute name="RECORDID">0</xsl:attribute>

    <COL><DATA><xsl:value-of select="parent::analyse/parent::file/@guid"/></DATA></COL>
    <COL><DATA><xsl:value-of select="@min"/></DATA></COL>
    <COL><DATA><xsl:value-of select="@max"/></DATA></COL>
    <COL><DATA><xsl:value-of select="@words"/></DATA></COL>
    </ROW>
    </xsl:for-each>
    </RESULTSET>

    ... so bekomme ich die Zuordnung der fuzzy-Werte zu den übergeordneten Knoten. Wobei mir zB nicht klar ist, ob und wofür ich die xsl:attribute Einträge brauche, es funktioniert jedenfalls. Und die doppelten '//' vor fuzzy ... ich nehme an, das ignoriert einfach sämtliche Pfadangaben und springt direkt zum tag ... parent::() wandert den Baum rückwärts nach oben, für jeden Knoten ein parent:: ... ich hab also wieder was gelernt. Für die vorliegende Aufgabe reicht es jedenfalls. Danke fürs Mitdenken!