2016-07-30 33 views
0

Ich entschuldige mich, wenn dies gefragt wurde, aber ich habe eine Menge Zeit versucht, das spezifische Beispiel zu finden, die ich suche zum.XLST/XML: Ziehen verschiedener Knoten beim Vergleichen von Attribut mit OHNE <xsl: for-each>

Ich versuche XML-Knoten aus einem XML-Dokument, das ich habe, zu durchsuchen. Hier ist meine xml

<?xml version="1.0" encoding="UTF-8"?> 
<courses> 
    <course number="341" credits="4.0"> 
    <title>Data Structures</title> 
    <section number="01" delivery="Classroom"> 
     <enrollment>15</enrollment> 
     <room>EA244</room> 
     <instructor> 
     <first>Nicole</first> 
     <last>Anderson</last> 
     </instructor> 
    </section> 
    <section number="02" delivery="Online"> 
     <enrollment>10</enrollment> 
     <instructor> 
     <first>Nicole</first> 
     <last>Anderson</last> 
     </instructor> 
     <instructor> 
     <first>Chi-Cheng</first> 
     <last>Lin</last> 
     </instructor> 
    </section> 
    <section number="03" delivery="Classroom"> 
     <enrollment>12</enrollment> 
     <room>SH102</room> 
     <instructor> 
     <first>Mark</first> 
     <last>Funk</last> 
     </instructor> 
    </section> 
    </course> 

</courses> 

Die XSLT Ich arbeite mit ist ok, es zieht alle Attribute und Elemente, die ich für den größten Teil benötigen, aber es gibt ein paar grundlegende Mängel auf: 1) Ich brauche zu ziehen NUR die Elemente mit den Lieferattributen "Classroom" und ich bekomme untergeordnete Elemente für JEDEN Kurs, da der boolesche Wert true zurückgibt und dann jedes untergeordnete Element von "course"

2) kann ich nicht nach sortieren Einschreibung, ich denke wegen des gleichen Problems. Ich bin für-each verwenden nicht in der Lage, und ich habe versucht, suchen und in XML-Rekursion zu verstehen, aber wenn ich rekursive Aufrufe versuchen, mit erhalte ich „null“, wenn ich meine XSLT testen

<xsl:template match="/"> 
<classes> 
    <xsl:apply-templates select="courses/course/section" /> 
    <xsl:apply-templates select="courses/course" /> 
</classes> 
</xsl:template> 

<xsl:template match="section"> 
    <xsl:attribute name="count"> 
    <xsl:value-of select="count(//section[@delivery='Classroom'])" /> 
    </xsl:attribute> 
</xsl:template> 

<xsl:template match="course"> 
<class> 
    <xsl:if test="section[@delivery='Classroom']"> 
    <xsl:attribute name="credits"> 
     <xsl:value-of select="@credits" /> 
    </xsl:attribute> 
    <xsl:attribute name="room"> 
     <xsl:value-of select="section/room" /> 
    </xsl:attribute> 
    <enrollment><xsl:value-of select="section/enrollment" /></enrollment> 
    <instructor><xsl:copy-of select="section/instructor" /></instructor> 
    <number><xsl:value-of select="@number" /></number> 
    <title><xsl:value-of select="title" /></title> 
    </xsl:if> 
    </class> 
    </xsl:template> 

Vielen Dank im Voraus an jeden, der helfen kann/will.

Edit: Das ist meine aktuelle Ausgabe:

<?xml version="1.0" encoding="UTF-8"?> 
<classes count="4"> 
    <class credits="4.0" room="EA244"> 
    <enrollment>15</enrollment> 
    <instructor> 
     <instructor> 
     <first>Nicole</first> 
     <last>Anderson</last> 
     </instructor> 
     <instructor> 
     <first>Nicole</first> 
     <last>Anderson</last> 
     </instructor> 
     <instructor> 
     <first>Chi-Cheng</first> 
     <last>Lin</last> 
     </instructor> 
     <instructor> 
     <first>Mark</first> 
     <last>Funk</last> 
     </instructor> 
    </instructor> 
    <number>341</number> 
    <title>Data Structures</title> 
    </class> 
    <class credits="4.0" room="AT102"> 
    <enrollment>9</enrollment> 
    <instructor> 
     <instructor> 
     <first>Chi-Cheng</first> 
     <last>Lin</last> 
     </instructor> 
     <instructor> 
     <first>Mingrui</first> 
     <last>Zhang</last> 
     </instructor> 
    </instructor> 
    <number>368</number> 
    <title>Introduction to Bioinformatics</title> 
    </class> 
    <class/> 
    <class credits="3.0" room="ST108"> 
    <enrollment>26</enrollment> 
    <instructor> 
     <instructor> 
     <first>Nicole</first> 
     <last>Anderson</last> 
     </instructor> 
    </instructor> 
    <number>385</number> 
    <title>Applied Database Management Systems</title> 
    </class> 
    <class/> 
</classes> 

Also das Problem, das ich habe ist, dass ich jeden Kurs muß (von der ersten XML-Datei) Klasse Kredite zu zeigen, die Anzahl und nur das Kind Knoten der Abschnitte, die in einem "Klassenzimmer" geliefert werden. Es funktioniert gut mit den meisten Fällen, da es nur einen Abschnitt für alle Kurse gibt, mit Ausnahme der ersten, die drei Abschnitte hat, von denen zwei @ delivery = "Classroom" sind. Dass man gibt mir alle untergeordneten Elemente des Kurses

Edit 2: die Ausgabe sollte wie folgt aussehen:

<?xml version="1.0" encoding="UTF-8"?> 
<classes count="4"> 
    <class credits="4.0" room="AT102"> 
    <number>368</number> 
    <title>Introduction to Bioinformatics</title> 
    <enrollment>9</enrollment> 
    <instructor> 
     <first>Chi-Cheng</first> 
     <last>Lin</last> 
    </instructor> 
    <instructor> 
     <first>Mingrui</first> 
     <last>Zhang</last> 
    </instructor> 
    </class> 
    <class credits="4.0" room="SH102"> 
    <number>341</number> 
    <title>Data Structures</title> 
    <enrollment>12</enrollment> 
    <instructor> 
     <first>Mark</first> 
     <last>Funk</last> 
    </instructor> 
    </class> 
    <class credits="4.0" room="EA244"> 
    <number>341</number> 
    <title>Data Structures</title> 
    <enrollment>15</enrollment> 
    <instructor> 
     <first>Nicole</first> 
     <last>Anderson</last> 
    </instructor> 
    </class> 
    <class credits="3.0" room="ST108"> 
    <number>385</number> 
    <title>Applied Database Management Systems</title> 
    <enrollment>26</enrollment> 
    <instructor> 
     <first>Nicole</first> 
     <last>Anderson</last> 
    </instructor> 
    </class> 
</classes> 

Ich glaube, der Grund, dass die zweite Klasse nicht angezeigt wird (und Herstellung eines neuen Klassenelement) ist, weil ich einen booleschen Wert von true bekomme, wenn ich Knoten zum ersten Mal ziehe, weil Abschnitt [@ delivery = 'Classroom'] in der ersten Instanz wahr ist. Es zieht also einfach alle Knotenpunkte. Dasselbe Problem verursacht auch, dass meine Sortierung mir eine falsche Ausgabe gibt.

+0

Es ist viel wahrscheinlicher, dass Sie Hilfe erhalten, wenn Sie Ihren Beitrag so bearbeiten, dass er die gewünschte Ausgabe-XML enthält. –

+0

Ich werde direkt auf diese –

+0

können Sie auch das gewünschte Ergebnis zeigen? Es ist mir nicht klar, ob Sie jedes Eingabefeld 'course' auf eine Ausgabe' class' abbilden und dann den 'section' Inhalt verschachteln wollen oder ob Sie jeden' ​​Kurs/Abschnitt' abbilden möchten [@delivery = 'classroom'] 'zu einer' Klasse'. Wie zum Sortieren und Verwenden von "Anwendungsvorlagen" können Sie dies mit z.B. ''. –

Antwort

0

Wenn Sie ein class für jede section möchten, die in einem Klassenzimmer geliefert wird, dann sollten Sie tun:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/courses"> 
    <xsl:variable name="classroom-sections" select="course/section[@delivery='Classroom']" /> 
    <classes count="{count($classroom-sections)}"> 
     <xsl:apply-templates select="$classroom-sections" /> 
    </classes> 
</xsl:template> 

<xsl:template match="section"> 
    <class credits="{../@credits}" room="{room}"> 
     <number> 
      <xsl:value-of select="../@number" /> 
     </number> 
     <xsl:copy-of select="../title | enrollment | instructor"/> 
    </class> 
</xsl:template> 

</xsl:stylesheet> 

P. S. Ich weiß nicht, warum Sie in Ihrem Titel betonen, dass Sie dies tun wollen "OHNE <xsl:for-each> zu verwenden". Die Anweisung xsl:for-each ist ein fester Bestandteil der XSLT-Sprache und könnte auch hier verwendet werden, ohne irgendwelche negativen Auswirkungen.

+0

Das hat wunderbar funktioniert. Ich sehe also, dass Sie eine Variable für Klassenabschnitte erstellt haben, die ich in einer vorherigen Iteration versucht habe, aber ich weiß, dass ich den XPath nicht als "Kurs/Abschnitt [@ delivery = 'Classroom']" eingestellt habe SO viel. Das macht sehr viel Sinn. Ich bin neu in XML und verstehe Java besser, funktionale Programmierung ist neu für mich. Dies ist ein großartiger Baustein. –