Announcement

Collapse
No announcement yet.

Inhalte von Textknoten als Attribute einfügen

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

  • Inhalte von Textknoten als Attribute einfügen

    Hallo zusammen,

    ich habe schon des Öfteren hier gestöbert. Nun habe ich mich endlich angemeldet, weil ich ein konkretes Problem habe und auf eure Hilfe hoffe!

    Eine XML-Struktur enthält Informationen zu Produkten:
    Code:
    <data>
    	<products>
    		<productset cat="11" store="3">
    			<product id="1">Teekocher Blau</product>
    			<product id="2">Teekocher Rot</product>			
    		</productset>
    		<productset cat="14" store="3">
    			<product id="1">Messerset</product>
    		</productset>
    	</products>
    	<productStocks>
    		<productset cat="11" store="3">
    			<product id="1">20</product>
    			<product id="2">30</product>			
    		</productset>
    	</productStocks>
    </data>
    Wie man sieht ist, der Knoten productStocks ziemlich überflüssig. Ich möchte gerne die Informationen, die dort auftauchen, als Attribute in die passenden Elemente unter products einfügen. Das würde dann in etwa so aussehen:
    Code:
    <data>
    	<products>
    		<productset cat="11" store="3">
    			<product id="1" stock="20">Teekocher Blau</product>
    			<product id="2" stock="30">Teekocher Rot</product>
    		</productset>
    		<productset cat="14" store="3">
    			<product id="1">Messerset</product>
    		</productset>
    	</products>
    </data>
    Da das productset mit cat="14" und store="3" keinen passenden Eintrag in productStocks enthält, wird hier kein Attribut eingetragen.

    Meint Ihr, so etwas kann man mit XSLT 1.0 bewerkstelligen? Bin für jede Hilfe sehr dankbar!

    Alex

  • #2
    Ansatz mit Identitäts-Template, angepasstem Template für product-Elemente und Template zum Ignorieren von productStocks-Elementen:
    Code:
    <xsl:template match="@* | node()">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
    </xsl:template>
    
    <xsl:template match="product">
      <xsl:copy>
        <xsl:if test="/data/productStocks/productset[@cat=current()/../@cat and @store=current()/../@store]">
          <xsl:attribute name="stock">
            <xsl:value-of select="/data/productStocks/productset[@cat=current()/../@cat
                                  and @store=current()/../@store]/product[@id=current()/@id]/text()"/>
            </xsl:attribute>
        </xsl:if>
        <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
    </xsl:template>
    
    <xsl:template match="productStocks"/>
    Ergebnis:
    Code:
    <data>
      <products>
        <productset cat="11" store="3">
          <product stock="20" id="1">Teekocher Blau</product>
          <product stock="30" id="2">Teekocher Rot</product>
        </productset>
        <productset cat="14" store="3">
          <product id="1">Messerset</product>
        </productset>
      </products>
    </data>

    Comment


    • #3
      Thomas, ich danke dir!

      Es funktioniert super. Jetzt, wo ich die Lösung sehe, sieht alles logisch und einfach aus. Ich habe aber vier Stunden dran gesessen und hab's nicht hinbekommen

      Comment

      Working...
      X