2017-01-19 1 views
0

Ich bin derzeit study xQuery Sprache, während ich einige Übungen habe ich eine Abfrage gefunden habe, die ich nicht tun kann. Ich wünschte wirklich, du könntest mir helfen.Hard Xquery zu implementieren

Ich habe n sortierten Dateien, die die gleichen Knoten, aber unterschiedliche Werte innerhalb des „value“ Attribut haben, wie, dass man:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <source name="File1.txt"> 
     <line nr="1" value="13" /> 
     <line nr="2" value="10" /> 
     <line nr="3" value="5" /> 
    </source> 
    <source name="File2.txt"> 
     <line nr="1" value="2" /> 
    </source> 
</root> 

ich eine xquery schreiben, die alle Quell-Tags und für jedes nimmt Quelltag wird es die Zeilen löschen, wenn der Wert Attribut ist weniger als 10.

In diesem Fall wäre das Ergebnis gewesen:

Also, für jede xML-fil e ich werde eine neue Datei erzeugen, wie die oben, die ich "B" nennen werde.

Jetzt muss ich eine Abfrage erstellen, die eine neue eindeutige XML-Datei erstellen wird (ich werde es C nennen), die Folgendes enthält: vorausgesetzt, dass jede B-Datei eine Priorisierung hat (es: B12> B10> B8> ...), ich muss die B-Dateien öffnen und:

  • Wenn ein Quellknoten in C fehlt, kopieren Sie es nach innen.
  • Fügen Sie für jeden Linienknoten ein neues Attribut namens "pos" hinzu, das die Position innerhalb der B-Dateipriorisierung der ersten B-Datei darstellt, die diese Zeile innerhalb dieses Quellenknotens enthält.
  • Wie das angegebene Beispiel: Priorisierung: B3, B1, B2, B4.

    • öffnen B3 für jeden Quellknoten, kopieren Sie sie in der C-Datei (es ist das erste, so dass es nur um sie kopiert)
      • Für jede Zeile Knoten innerhalb dieses Quellknoten, kopieren Sie alle Linien (es ist die erste, also werde ich sie nur kopieren) und fügen Sie das Attribut "pos" mit dem Wert 1 (Position von B3 innerhalb der Priorisierung) für jede Zeile.
      • Öffnen Sie B1, für jeden Quellknoten, wenn dies in der C-Datei fehlt, kopieren Sie es in die C-Datei.
        • Für jede Zeile Knoten innerhalb dieses Quellknoten, kopieren Sie alle Zeilen, die das Attribut „pos“ mit dem Wert 2.
      • Öffnen B2, für jeden Quellknoten, fehlen und hinzufügen, wenn diese fehlt, ist Kopieren Sie die Datei innerhalb der C-Datei in die C-Datei.
        • Für jede Zeile Knoten innerhalb dieses Quellknoten, kopieren Sie alle Zeilen, die das Attribut „pos“ mit dem Wert 3.
      • öffnen B4, für jeden Quellknoten, fehlen und hinzufügen, wenn diese fehlt, ist Kopieren Sie die Datei innerhalb der C-Datei in die C-Datei.
      • Kopieren Sie für jeden Linienknoten innerhalb dieses Quellenknotens alle fehlenden Linien und fügen Sie das Attribut "pos" mit dem Wert 4 hinzu.

    Das ist es, ich weiß es nicht einfach ist (glaube ich), so will ich wirklich verstehen, wie man Skript eine Abfrage, die vor allem die intructions realisieren.

    Vielen Dank, sehr, viel für die, die mir helfen werden.

    Antwort

    1

    Die Art der Abfrage, wo die Ausgabe nur geringfügige Änderungen von der Eingabe hat, ist tatsächlich viel einfacher mit XSLT zu tun. Darüber hinaus ist XSLT in der Lage, während einer einzigen Ausführung mehrere Ausgabedateien zu erzeugen, was in XQuery nicht direkt möglich ist. In XSLT 3.0 dies sein könnte:

    <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        version="3.0"> 
    
    <xsl:mode on-no-match="shallow-copy"/> 
    
    <xsl:template match="line[@value lt 10]"/> 
    
    <xsl:template name="xsl:initial-template"> 
        <xsl:for-each select="collection('file:///input-dir')"> 
        <xsl:result-document href="{tokenize(document-uri(.), '/')[last()]}"> 
         <xsl:apply-templates/> 
        </xsl:result-document> 
        </xsl:for-each> 
    </xsl:template> 
    

    dies in XQuery zu tun, ist es wahrscheinlich am besten, um die Abfrage einmal pro Eingabedatei auszuführen, die bedeutet, dass Sie Logik in einer externen Sprache benötigen der Eingabedateien zu durchlaufen und stellen Sie die entsprechenden Ausgabedatei für jeden Eingang. Sie benötigen dann eine rekursive Funktion, die jedes Element übernimmt und, wenn es nicht eines der zu löschenden Elemente ist, ein neues Element mit demselben Namen erstellt, die Attribute kopiert und sich selbst aufruft, um die untergeordneten Elemente zu verarbeiten. So kann es gemacht werden, aber es ist viel mehr Arbeit.