Announcement

Collapse
No announcement yet.

Namespace trennen und sortieren

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

  • Namespace trennen und sortieren

    Hallo!

    Ich habe folgende Aufgabe:

    meinem template wird eine Liste übergeben mit Elementen, die z.b. so

    <auto_hersteller_01>VW</auto_hersteller_01>
    <marke_01>Polo</marke_01>
    <farbe_01>Blau</farbe_01>
    <hersteller_02>Opel</hersteller_02>
    <marke_02>Astra</marke_02>
    <farbe_02>Rot</farbe_02>
    <anzahl_autos>2</anzahl_autos>

    aussehen kann.

    mein Ziel ist eine Liste, die quasi objektorientiert erstellt wird:

    <number>01</number>
    <auto_hersteller>VW</auto_hersteller>
    <marke>Polo</marke>
    <farbe>Blau</farbe>
    <number>02</number>
    <auto_hersteller>Opel</auto_hersteller>
    <marke>Astra</marke>
    <farbe>Rot</farbe>
    <anzahl_autos>2</anzahl_autos>

    Ich habe mir bis jetzt folgendes überlegt:

    Code:
    	<xsl:template name="stringreader">
    				<xsl:param name="wurzelknoten"/>
    				<xsl:for-each select="$wurzelknoten">
    					<xsl:for-each select="*">
    						<xsl:variable name="nodename" select="name(.)"/>
    						<xsl:variable name="nodevalue" select="."/>
    						<xsl:analyze-string select="$nodename" regex="([a-z_]*[a-z]+)_?(\d+)">
    							<xsl:matching-substring>						
    								<xsl:variable name="newnode_name" select="regex-group(1)"/>
    								<xsl:variable name="newnumber" select="regex-group(2)"/>						
    										<einzelnername>
    											<xsl:element name="{$newnode_name}">
    												<xsl:value-of select="$nodevalue"/>
    											</xsl:element>
    											<nr>
    												<xsl:value-of select="regex-group(2)"/>
    											</nr>									
    										</einzelnername>
    							</xsl:matching-substring>
    							<xsl:non-matching-substring>
    								<xsl:element name="{$nodename}">
    									<xsl:value-of select="$nodevalue"/> 
    								</xsl:element>
    							</xsl:non-matching-substring>
    						</xsl:analyze-string>
    					</xsl:for-each>	
    				</xsl:for-each>
    	</xsl:template>
    	
    	<xsl:template name="getDocs">
    			<xsl:param name="codeparser"/>
    				<xsl:for-each-group select="$codeparser/*" group-by="nr">
    					<body>
    						<number><xsl:value-of select="nr"/></number>
    						<xsl:for-each select="current-group()/*">
    							<xsl:variable name="nodename" select="name(.)"/>
    							<xsl:variable name="nodevalue" select="."/>
    							<xsl:analyze-string select="$nodename" regex="nr">
    								<xsl:non-matching-substring>
    									<xsl:element name="{$nodename}">
    										<xsl:value-of select="$nodevalue"/>
    									</xsl:element>
    								</xsl:non-matching-substring>
    							</xsl:analyze-string>
    						</xsl:for-each>
    					</body>
    				</xsl:for-each-group>
    		</xsl:template>
    das Problem ist allerdings, dass ich damit nur die Elemente auslesen kann, die auch wirklich eine Nummer im Namen haben. Alle anderen, sind zwar im ersten template noch vorhanden, werden später aber nicht mehr ausgelesen...
    Wie greife ich auf die restlichen Elemente zu?

    Es kann auch sein, dass meine Lösung im Ansatz schon falsch ist, daher sind auch ganz neue Vorschläge willkommen!

    Vielen Dank im Voraus für eure Hilfe!

    Gruß
    Alex

  • #2
    habe jetzt was eingebaut:
    Code:
    <xsl:template name="getDocs">
    			<xsl:param name="codeparser"/>
    				<xsl:for-each select="$codeparser/*[not(self::einzelnername)]">
    					<xsl:copy-of select="."/>
    				</xsl:for-each>
    				<xsl:for-each-group select="$codeparser/*" group-by="nr">
    					<body>
    						<number><xsl:value-of select="nr"/></number>
    						<xsl:for-each select="current-group()/*">
    							<xsl:variable name="nodename" select="name(.)"/>
    							<xsl:variable name="nodevalue" select="."/>
    							<xsl:analyze-string select="$nodename" regex="nr">
    								<xsl:non-matching-substring>
    									<xsl:element name="{$nodename}">
    										<xsl:value-of select="$nodevalue"/>
    									</xsl:element>
    								</xsl:non-matching-substring>
    							</xsl:analyze-string>
    						</xsl:for-each>
    					</body>
    				</xsl:for-each-group>
    		</xsl:template>
    damit geht es eigentlich, aber so ganz glücklich macht es mich nicht...

    Vielleicht bessere Vorschläge für das Ganze?

    Comment


    • #3
      Habe vor allem Probleme wenn zwieschendurch Elemente auftauchen, die in etwa so heissen:

      <auto_bla_01_wagen_no_01></auto_bla_01_wagen_no_01>
      <auto_bla_01_wagen_no_02></auto_bla_01_wagen_no_02>

      und zwieschendurch wieder

      <auto_bla_01></auto_bla_01>

      usw...

      Wenn ich die nun erst nach der ersten und dann nach der zweiten Nummber sortieren will, bekomme ich echt schwierigkeiten...

      Vielen Dank für eure Antworten im Voraus!
      Gruß
      Alex

      Comment


      • #4
        Hilfe!!!

        Ich bin immer noch dabei meine Listen zu sortieren.

        Ich bekomme also folgende Listen übergeben:

        <auto_hersteller_01>VW</auto_hersteller_01>
        <marke_01_merkmal_01>Polo</marke_01_merkmal_01>
        <farbe_01_merkmal_02>Blau</farbe_01_merkmal_02>
        <hersteller_02>Opel</hersteller_02>
        <marke_02_merkmal_01>Astra</marke_02_merkmal_01>
        <farbe_02_merkmal_02>Rot</farbe_02_merkmal_02>
        <anzahl_autos>2</anzahl_autos>

        und will diese sortieren zu

        <auto_hersteller>
        <auto_hersteller_no>01</auto_hersteller_no>
        <hersteller>VW</hersteller>
        <merkmal>
        <merkmal_no>01</merkmal_no>
        <marke>Polo</marke>
        </merkmal>
        <merkmal>
        <merkmal_no>02</merkmal_no>
        <farbe>Blau</farbe>
        </auto_hersteller>
        <auto_hersteller>
        <auto_hersteller_no>02</auto_hersteller_no>
        <hersteller>Opel</hersteller>
        <merkmal>
        <merkmal_no>01</merkmal_no>
        <marke>Astra</marke>
        </merkmal>
        <merkmal>
        <merkmal_no>02</merkmal_no>
        <farbe>Rot</farbe>
        </auto_hersteller>
        <anzahl_autos>2</anzahl_autos>


        Bin da wirklich am verzweifeln, vor Allem wenn es um die zweite Sortierung geht. Bitte um Hilfe!

        Vielen Dank im Voraus!

        Comment


        • #5
          Erläutere mal genauer, welche Elemente in welche Ausgaben zu wandeln sind. Mal heißt es auto_hersteller_01, mal hersteller_02 ohne auto_ usw. Das erschließt sich mir nicht so richtig und somit fällt es auch schwer, einen eindeutigen Algorithmus zu finden. Vielleicht mal am Eingangs-XML ansetzen ...

          Comment


          • #6
            Stimmt, sorry.

            Werde später einfach die richtige Datei hier rein kopieren, grade leider nicht parat. Im Grunde ist es aber einfach so, dass es eine Liste mit Elementen gibt, wo sich immer wieder die Namen wiederholen, nur die Zahlen werden halt höher.

            Ähnlich wie im Beispiel, kommt da ein Element mit name_01 und die Elemente nach dem sind eigentlich Unterpunkte davon mit Namen wie name_01_namen_01 bis name_01_namen_07. Dann geht die erste Zahl eins höher, also name_02 und es folgen name_02_namen_01 bis name_02_namen_07, usw.

            Die Namen zu trennen ist ja kein Problem, aber die dann immer richtig zu sortieren, klappt leider nicht so gut.

            Aber wie gesagt, ich kopiere später auch die richtige Liste hier rein...

            Vielen Dank schon mal!

            Comment


            • #7
              die Liste

              So, hier ist die Liste. Muss zugeben, dass ich immer noch nicht weiter bin.

              <auto_hersteller_01_marke>aaa</auto_hersteller_01_marke>
              <auto_hersteller_01_artikel_nummer>1.14159E0</auto_hersteller_01_artikel_nummer>
              <auto_hersteller_01_wochen_tag_01>2008-03-13</auto_hersteller_01_wochen_tag_01>
              <auto_hersteller_01_wochen_tag_02>2008-03-14</auto_hersteller_01_wochen_tag_02>
              <auto_hersteller_01_wochen_tag_03>2008-03-15</auto_hersteller_01_wochen_tag_03>
              <auto_hersteller_01_wochen_tag_04>2008-03-16</auto_hersteller_01_wochen_tag_04>
              <auto_hersteller_01_wochen_tag_05>2008-03-17</auto_hersteller_01_wochen_tag_05>
              <auto_hersteller_01_wochen_tag_06>2008-03-18</auto_hersteller_01_wochen_tag_06>
              <auto_hersteller_01_wochen_tag_07>2008-03-19</auto_hersteller_01_wochen_tag_07>
              <auto_hersteller_02_marke>bbb</auto_hersteller_02_marke>
              <auto_hersteller_02_artikel_nummer>3.14159E0</auto_hersteller_02_artikel_nummer>
              <auto_hersteller_02_wochen_tag_01>2008-03-23</auto_hersteller_02_wochen_tag_01>
              <auto_hersteller_02_wochen_tag_02>2008-03-24</auto_hersteller_02_wochen_tag_02>
              <auto_hersteller_02_wochen_tag_03>2008-03-25</auto_hersteller_02_wochen_tag_03>
              <auto_hersteller_02_wochen_tag_04>2008-03-26</auto_hersteller_02_wochen_tag_04>
              <auto_hersteller_02_wochen_tag_05>2008-03-27</auto_hersteller_02_wochen_tag_05>
              <auto_hersteller_02_wochen_tag_06>2008-03-28</auto_hersteller_02_wochen_tag_06>
              <auto_hersteller_02_wochen_tag_07>2008-03-29</auto_hersteller_02_wochen_tag_07>
              Zuletzt editiert von w_ing; 20.06.2008, 09:18.

              Comment


              • #8
                Ziel

                Die Liste möchte ich nun in etwa so aussehen lassen:

                Code:
                <auto_hersteller>
                <auto_hersteller_no>01</auto_hersteller_no>
                <marke>aaa</marke>
                <artikel_nummer>1.14159E0</artikel_nummer>
                <wochen_tag>
                  <wochen_tag_no>01</wochen_tag_no>
                  <date>2008-03-13</date>
                </wochen_tag>
                <wochen_tag>
                  <wochen_tag_no>02</wochen_tag_no>
                  <date>2008-03-14</date>
                </wochen_tag>
                </auto_hersteller>
                usw. für alle Wochentage und dann auch für weitere autohersteller...

                VIELEN DANK!

                Comment


                • #9
                  Unter Annahme eines Wurzelelements auto_hersteller_liste auf Eingabe- bzw. Ausgabeseite führt dieser Ansatz zur gesuchten Struktur:
                  Code:
                  <?xml version="1.0" encoding="ISO-8859-1"?>
                  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                    <xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes"/>
                  
                    <xsl:template match="auto_hersteller_liste">
                      <auto_hersteller_liste>
                        <xsl:apply-templates select="*[contains(local-name(),'marke')]"/>
                      </auto_hersteller_liste>
                    </xsl:template>
                  
                    <xsl:template match="*[contains(local-name(),'marke')]">
                      <auto_hersteller>
                        <xsl:variable name="nr" select="substring(local-name(),17,2)"/>
                        <auto_hersteller_no>
                          <xsl:value-of select="$nr"/>
                        </auto_hersteller_no>
                        <marke>
                          <xsl:value-of select="."/>
                        </marke>
                        <artikel_nummer>
                          <xsl:value-of select="following-sibling::*[1]"/>
                        </artikel_nummer>
                        <xsl:for-each select="following-sibling::*[contains(local-name(),concat('auto_hersteller_',$nr,'_wochen_tag_'))]">
                          <wochen_tag>
                            <wochen_tag_no>
                              <xsl:value-of select="substring(local-name(),31,2)"/>
                            </wochen_tag_no>
                            <date>
                              <xsl:value-of select="."/>
                            </date>
                          </wochen_tag>
                        </xsl:for-each>
                      </auto_hersteller>
                    </xsl:template>
                  
                  </xsl:stylesheet>

                  Comment


                  • #10
                    Vielen Dank! Das bringt mich schon mal weiter.

                    Comment

                    Working...
                    X