Announcement

Collapse
No announcement yet.

Attribute sortieren nach Position

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Attribute sortieren nach Position

    Hallo!

    Ich bin neu hier in dem Forum und hoffe, ich habe gleich Glück und bekomme von jemandem Hilfe.

    Ich möchte die Attribute @name von folgenden Pfaden 'annotationSet/layers/layer[@name='GF']/labels/label', 'annotationSet/layers/layer[@name='PT']/labels/label' und 'annotationSet/layers/layer[@name='FE']/labels/label' in der folgenden XML-Datei (nur ein klitzekleiner Auszug, es hat hunderte weiterer annotationSets) sortiert haben und zwar so:
    [Event, Dep, AJP], [Entity, Gen, Poss], [Degree, Dep, AVP] . Also, ich möchte immer das erste Attribut mit dem ersten Attribut, und das 2. Attribut mit dem 2.Attribut ... etc. ... sortiert bzw. aufgelistet haben.

    Was ich bräuchte, wär ein Denkanstoß oder eine grobe Skizze, wie das funktionieren könnte. Wer mir mehr verraten möchte, darf das natürlich gerne . Noch dazu muss ich sagen, ich bin recht neu im Umgang mit XSLT. Ich bin über jede Hilfe seeehr dankbar!

    Hier ist die XML-Datei:

    <annotationSet ID="1905611" status="MANUAL" frameName="Capability" frameRef="990" luName="potential.n" lexUnitRef="10678">
    <layers>
    <layer ID="9829938" name="Target">
    <labels>
    <label name="Target" ID="31157684" start="92" end="100" />
    </labels>
    </layer>
    <layer ID="9829939" name="FE" rank="1">
    <labels>
    <label name="Event" ID="31168790" start="83" end="90" />
    <label name="Entity" ID="31168791" start="72" end="76" />
    <label name="Degree" ID="31168792" start="78" end="81" />
    </labels>
    </layer>
    <layer ID="9829940" name="GF">
    <labels>
    <label name="Dep" ID="31168793" start="83" end="90" />
    <label name="Gen" ID="31168795" start="72" end="76" />
    <label name="Dep" ID="31168797" start="78" end="81" />
    </labels>
    </layer>
    <layer ID="9829941" name="PT">
    <labels>
    <label name="AJP" ID="31168794" start="83" end="90" />
    <label name="Poss" ID="31168796" start="72" end="76" />
    <label name="AVP" ID="31168798" start="78" end="81" />
    </labels>
    </layer>
    <layer ID="9829942" name="Other" />
    <layer ID="9829943" name="Sent" />
    <layer ID="9829944" name="Noun" />
    </layers>
    </annotationSet>

  • #2
    Zum Verständnis wäre das gesuchte Ergebnis interessant. Sollen ID, start, end ausgegeben werden?

    Comment


    • #3
      Es soll nur das Attribut name bei <label> ausgegeben werden. Und zwar soll das erste Attribut name immer mit dem ersten Attribut name kombiniert werden.

      Meine Ausgabe sollte bei diesem Beispiel (mit diesem XML Code) so aussehen: [Event, Dep, AJP], [Entity, Gen, Poss], [Degree, Dep, AVP]

      Comment


      • #4
        Das geht dann in diese Richtung:
        Code:
        <xsl:template match="annotationSet/layers">
           <xsl:text>[</xsl:text>
           <xsl:value-of select="layer[@name='FE']/labels/label[1]/@name"/><xsl:text>, </xsl:text>
           <xsl:value-of select="layer[@name='GF']/labels/label[1]/@name"/><xsl:text>, </xsl:text>
           <xsl:value-of select="layer[@name='PT']/labels/label[1]/@name"/><xsl:text>], </xsl:text>
        
           <xsl:text>[</xsl:text>
           <xsl:value-of select="layer[@name='FE']/labels/label[2]/@name"/><xsl:text>, </xsl:text>
           <xsl:value-of select="layer[@name='GF']/labels/label[2]/@name"/><xsl:text>, </xsl:text>
           <xsl:value-of select="layer[@name='PT']/labels/label[2]/@name"/><xsl:text>], </xsl:text>
        
           <xsl:text>[</xsl:text>
           <xsl:value-of select="layer[@name='FE']/labels/label[3]/@name"/><xsl:text>, </xsl:text>
           <xsl:value-of select="layer[@name='GF']/labels/label[3]/@name"/><xsl:text>, </xsl:text>
           <xsl:value-of select="layer[@name='PT']/labels/label[3]/@name"/><xsl:text>]</xsl:text>
        </xsl:template>
        Ergebnis:
        [Event, Dep, AJP], [Entity, Gen, Poss], [Degree, Dep, AVP]

        Comment


        • #5
          @thomas: Vielen Dank für deine schnelle Antwort!

          Gibt es da vllt etwas womit ich die label[1], label[2], etc. automatisch durchnummerieren kann?

          Beispielsweise etwas mit position()? Oder ähnlichem? Außer position() fällt mir nichts ein... das wäre nämlich super!

          Ich stelle mir das dann so und ähnlich vor:

          <xsl:template match="annotationSet/layers">
          <xsl:text>[</xsl:text>
          <xsl:value-of select="layer[@name='FE']/labels/label[position()]/@name"/><xsl:text>, </xsl:text>
          <xsl:value-of select="layer[@name='GF']/labels/label[position()]/@name"/><xsl:text>, </xsl:text>
          <xsl:value-of select="layer[@name='PT']/labels/label[position()]/@name"/><xsl:text>], </xsl:text>

          Comment


          • #6
            und es hat sich nochmal ein problem ergeben:

            wie kann ich rausfinden, hier in diesem beispiel bei label name="Target", ob das start Attribut größer oder kleiner als das start Attribut bei layer name="GF" ist?

            Comment


            • #7
              Weiterer Ansatz:
              Code:
              <xsl:template match="annotationSet/layers">    
                <xsl:for-each select="layer[@name='FE' or @name='GF' or @name='PT']"> 
                  <xsl:variable name="i" select="position()"/>
                  <xsl:text>[</xsl:text>
                  <xsl:value-of select="../layer[@name='FE']/labels/label[$i]/@name"/><xsl:text>, </xsl:text>
                  <xsl:value-of select="../layer[@name='GF']/labels/label[$i]/@name"/><xsl:text>, </xsl:text>
                  <xsl:value-of select="../layer[@name='PT']/labels/label[$i]/@name"/><xsl:text>]</xsl:text>
                  <xsl:if test="$i != last()"><xsl:text>, </xsl:text></xsl:if>
                </xsl:for-each>
              </xsl:template>
              Beim Attributvergleich ist zu beachten, dass hier das start-Attribut eines label-Elements offenbar mit den start-Attributen dreier label-Elemente verglichen werden müsste.

              Ein Vergleich könnte so aussehen:
              Code:
              <xsl:if test="//label[@name='Target']/@start &gt; //layer[@name='GF']//label[1]/@start">
                <xsl:text>größer</xsl:text>
              </xsl:if>
              Alternativ müssten mehrere Vergleiche kombiniert werden.

              Comment


              • #8
                @Thomas: Vielen Dank für deine gute und vorallem superschnelle Hilfe!

                Ich habe deine Hilfe mal als Komplettcode verbastelt, allerdings scheint etwas mit den Pfaden nicht zu stimmen... irgendwie sitz ich jetzt schon länger dran, kann aber nicht die richtige Lösung finden.
                Vielleicht hat jemand kurz ein paar Minuten übrig und kann über den Code schauen und mir evtl Tipps geben? Das wäre klasse!

                Der Output sollte sein (in diesem Beispiel):
                {ASLACTON , England -- Of all scenes that evoke rural England , this is one of the loveliest : An ancient stone church stands amid the fields , the sound of bells cascading from its tower , calling the faithful to evensong .}
                stand,[[Ext,NP,before,Theme],[Dep,PP,after,Location]]

                Hier der XSLT-Code:

                Code:
                <?xml version="1.0" encoding="UTF-8"?>
                <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                
                
                    <xsl:output method="text" indent="no"/>
                    <xsl:strip-space elements="*"/>
                
                    <xsl:variable name="newline">
                        <xsl:text>
                        </xsl:text>
                    </xsl:variable>
                
                
                
                    <xsl:template match="/">
                        <xsl:for-each
                            select="//sentence/descendant-or-self::annotationSet | //sentence/descendant-or-self::text ">
                            <xsl:if test="string-length(text())!=0">
                                <xsl:text>{</xsl:text>
                                <xsl:value-of select="text()"/>
                                <xsl:text>}</xsl:text>
                                <xsl:value-of select="$newline"/>
                                <xsl:value-of select="$newline"/>
                            </xsl:if>
                
                            <xsl:for-each select=".">
                                <xsl:variable name="i" select="position()"/>
                                <xsl:variable name="string">
                                    <xsl:value-of select="@luName"/>
                                </xsl:variable>
                                <xsl:if test="string-length(@luName)!=0 and contains($string, '.v')">
                                    <xsl:value-of select="translate(@luName,'.v','')"/>
                                    <xsl:text>,</xsl:text>
                
                                    <xsl:for-each
                                        select="./layers/layer[@name='FE' or @name='GF' or @name='PT']/labels/label ">
                                        <xsl:text>[</xsl:text>
                                        <xsl:value-of select="/layer[@name='FE']/labels/label[$i]/@name"/>
                                        <xsl:text>, </xsl:text>
                                        <xsl:value-of select="/layer[@name='GF']/labels/label[$i]/@name"/>
                                        <xsl:text>, </xsl:text>
                                        <xsl:choose>
                                            <xsl:when
                                                test="//layer/label[@name='Target']/@start &gt; //layer[@name='GF']//label[$i]/@start">
                                                <xsl:text>[after</xsl:text>
                                            </xsl:when>
                                            <xsl:otherwise>
                                                <xsl:text>[before</xsl:text>
                                            </xsl:otherwise>
                                        </xsl:choose>
                                        <xsl:text>, </xsl:text>
                                        <xsl:value-of select="/layer[@name='PT']/labels/label[$i]/@name"/>
                                        <xsl:text>]</xsl:text>
                                        <xsl:if test="position() != last()">
                                            <xsl:text>,</xsl:text>
                                        </xsl:if>
                                        <xsl:if test="position() = last()">
                                            <xsl:text>]</xsl:text>
                                        </xsl:if>
                                    </xsl:for-each>
                                    <xsl:value-of select="$newline"/>
                                    <xsl:value-of select="$newline"/>
                                </xsl:if>
                            </xsl:for-each>
                        </xsl:for-each>
                    </xsl:template>
                
                </xsl:stylesheet>
                Und hier ein Auszug des XML-Files:
                Code:
                <paragraph ID="5208" documentOrder="3">
                          <sentences>
                            <sentence ID="1228672">
                              <text>ASLACTON , England -- Of all scenes that evoke rural England , this is one of the loveliest : An ancient stone church stands amid the fields , the sound of bells cascading from its tower , calling the faithful to evensong .</text>
                              <annotationSets>
                                <annotationSet ID="1904382" status="UNANN">
                                  <layers>
                                    <layer ID="9836254" name="NER">
                                      <labels>
                                        <label name="location" ID="31168139" start="0" end="17" />
                                        <label name="location" ID="31168141" start="53" end="59" />
                                      </labels>
                                    </layer>
                                  </layers>
                                </annotationSet>
                                <annotationSet ID="1904710" status="MANUAL" frameName="Being_located" frameRef="960" luName="stand.v" lexUnitRef="10027">
                                  <layers>
                                    <layer ID="9823880" name="Target">
                                      <labels>
                                        <label name="Target" ID="31152199" start="118" end="123" />
                                      </labels>
                                    </layer>
                                    <layer ID="9823881" name="FE" rank="1">
                                      <labels>
                                        <label name="Theme" ID="31152285" start="94" end="116" />
                                        <label name="Location" ID="31152288" start="125" end="139" />
                                      </labels>
                                    </layer>
                                    <layer ID="9823882" name="GF">
                                      <labels>
                                        <label name="Ext" ID="31152287" start="94" end="116" />
                                        <label name="Dep" ID="31152290" start="125" end="139" />
                                      </labels>
                                    </layer>
                                    <layer ID="9823883" name="PT">
                                      <labels>
                                        <label name="NP" ID="31152286" start="94" end="116" />
                                        <label name="PP" ID="31152289" start="125" end="139" />
                                      </labels>
                                    </layer>
                                    <layer ID="9823884" name="Other" />
                                    <layer ID="9823885" name="Sent" />
                                    <layer ID="9823886" name="Verb" />
                                  </layers>
                                </annotationSet>
                                <annotationSet ID="1904728" status="MANUAL" frameName="Sensation" frameRef="71" luName="scene.n" lexUnitRef="10189">
                                  <layers>
                                    <layer ID="9823946" name="Target">
                                      <labels>
                                        <label name="Target" ID="31152261" start="29" end="34" />
                                      </labels>
                                    </layer>
                                    <layer ID="9823947" name="FE" rank="1">
                                      <labels>
                                        <label name="Percept" ID="31152262" start="29" end="34" />
                                      </labels>
                                    </layer>
                                    <layer ID="9823948" name="GF" />
                                    <layer ID="9823949" name="PT" />
                                    <layer ID="9823950" name="Other" />
                                    <layer ID="9823951" name="Sent" />
                                    <layer ID="9823952" name="Noun" />
                                  </layers>
                                </annotationSet>
                Zuletzt editiert von bchica; 22.01.2009, 18:53.

                Comment


                • #9
                  so, nun hab ichs doch selber geschafft bis auf eine kleinigkeit.
                  der output sieht momentan so aus:
                  smile, [[Dep, AVP, before, Time], [Ext, NP, before, Agent], [, , after, ]]

                  sollte aber so aussehen:
                  smile, [[Dep, AVP, before, Time], [Ext, NP, before, Agent]]

                  leere klammern (bzw. fast leere) sollten nicht ausgegeben werden. über tipps bin ich dankbar!

                  hier mein code:

                  Code:
                  
                  
                  <?xml version="1.0" encoding="UTF-8"?>
                  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
                      
                      <xsl:template match="//annotationSet">
                          <xsl:for-each select=".">            
                              <xsl:if test="string-length(@luName)!=0 and contains(@luName, '.v')">
                                  <xsl:value-of select="translate(@luName,'.v','')"/>
                                  <xsl:text>, </xsl:text>
                                      <xsl:for-each select="layers/layer[@name='FE' or @name='GF' or @name='PT']"> 
                                          <xsl:variable name="i" select="position()"/>
                                          <xsl:if test="position() = 1">
                                              <xsl:text>[</xsl:text>
                                          </xsl:if>
                                          <xsl:text>[</xsl:text>
                                          <xsl:value-of select="../layer[@name='GF']/labels/label[$i]/@name"/><xsl:text>, </xsl:text>
                                          <xsl:value-of select="../layer[@name='PT']/labels/label[$i]/@name"/><xsl:text>, </xsl:text>
                                        <xsl:choose>
                   					<xsl:when test="../layer/labels/label[@name='Target']/@start &gt; ../layer[@name='GF']/labels/label[$i]/@start">
                    							<xsl:text>before, </xsl:text>
                  						</xsl:when>
                  						<xsl:otherwise>
                    							<xsl:text>after, </xsl:text>	
                  						</xsl:otherwise>
                  						</xsl:choose>
                  						<xsl:if test="../layer/labels/label[@name='PP']">
                  						<xsl:value-of select="../layer/labels/label[@name='PP']/@start and ../layer/labels/label[@name='PP']/@end"/>
                  						</xsl:if>
                  						<xsl:value-of select="../layer[@name='FE']/labels/label[$i]/@name"/><xsl:text>]</xsl:text>
                                          <xsl:if test="$i != last()"><xsl:text>, </xsl:text></xsl:if>
                                          <xsl:if test="position() = last()">
                                              <xsl:text>]</xsl:text>
                                          </xsl:if>
                                      </xsl:for-each>
                                  </xsl:if>
                          </xsl:for-each>
                      </xsl:template>
                      
                  
                  </xsl:stylesheet>
                  

                  Comment


                  • #10
                    Prüfe mittels string-length(...) die Zeichenlänge der gesuchten Inhalte. Schreibe die jeweiligen Klammern, sofern Werte größer 0 auftreten.

                    Comment

                    Working...
                    X