Dixi86: Knoten zählen wenn Attribut-Wert gleich Variable ist

Hallo selfhtml-Forum,

Ich habe ein Frage bzgl XPath... Ich möchte in folgender XML, die hit-Knoten pro Attribut-Wert von @page zählen. Die Attribut-Werte von @page bekomme ich aus dem Attribut @id unter dem Knoten page. Die Anzahl page-Knoten sind dynamisch können aber je @id nur einmal vorkommen, die Anzahl der hit-Knoten pro XML sind auch dynamisch und dürfen je @page merhmals vorkommen...
Ich möchte jetzt die Anzahl der hit-Knoten pro @pages zählen! Ich versuche in meinem Lösungs-Ansatz jetzt, dass ich die Anzahl des hit-Knoten zählen, wenn die @id und @pages gleich sind... es Funktioniert allerdings nicht so richig...

  
<?xml version="1.0" encoding="UTF-8" ?>  
<report xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
	<document>  
		<doc_info>  
			<filename>Referenz.pdf</filename>  
			<created>12.04.2012 16:35</created>  
		</doc_info>  
		<pages>  
			<page id="PAG1"/>  
			<page id="PAG2"/>  
			<page id="PAG3"/>  
		</pages>  
	</document>  
	<results>  
		<hits>  
			<hit page="PAG1"></hit>  
			<hit page="PAG1"></hit>  
			<hit page="PAG1"></hit>  
			<hit page="PAG1"></hit>  
			<hit page="PAG2"></hit>  
			<hit page="PAG2"></hit>			  
			<hit page="PAG2"></hit>  
			<hit page="PAG3"></hit>  
			<hit page="PAG3"></hit>  
			<hit page="PAG3"></hit>  
			<hit page="PAG3"></hit>  
			<hit page="PAG3"></hit>  
		</hits>  
	</results>  
</report>
<?xml version="1.0" encoding="utf-8"?>  
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
    <xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>  
     <xsl:template match="dateisammlung">  
        <html xmlns="http://www.w3.org/1999/xhtml">  
            <head>  
                <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>  
                <title>Test</title>  
            </head>  
            <body>  
            	<font face="Arial" size="-1">  
            	<table border="1">  
            	<tr>  
            		<td align="center">Datum Auftragseingang</td>  
            		<td align="center">Dateiname</td>  
            		<td align="center">Seiten</td>  
					<td align="center">Anzahl Objekte/Seite</td>  
            	</tr>  
              		<xsl:apply-templates select="datei/document(@url)//results"/>  
                </table>  
                </font>  
            </body>  
        </html>  
    </xsl:template>  
  
    <xsl:template match="report//results">  
               	 	<tr>  
    	<!-- Auftragseingang -->  
    			   		<td><xsl:value-of select="//document/doc_info/created"/></td>  
    	<!-- Dateiname -->  
    			   		<td><xsl:value-of select="//document/doc_info/filename"/></td>  
    	<!-- Seitenanzahl -->  
    			   		<td><xsl:value-of select="//document/pages/count(//page)"/></td>  
    			   		<td><xsl:value-of select="count(//hit/@page)"/></td> 			   		  
  
  
  
		    	<!-- Ist Anzahl der Objekte -->  
 			<xsl:for-each select="//pages/page">  
 			 			 <tr>  
 			<xsl:variable name="Seite">  
  
 				 			<xsl:value-of select="./@id"/>  
  
 			</xsl:variable>  
 			 			  
						<td></td>  
						<td></td>  
    					<td><xsl:value-of select="$Seite"/></td>  
  
    					<td><xsl:if test="$Seite=//hits/hit/@page"><xsl:value-of select="count(//hit/@page='$Seite')"/></xsl:if></td>  
    						  
    					</tr>  
    					  
			</xsl:for-each>  
			</tr>  
    </xsl:template>  
  
  
  
</xsl:stylesheet>

Da ich mehrere XML-Dateien habe, gibt es noch eine weitere XML die auf die XML-Dateien verweist...

<?xml version="1.0" encoding="iso-8859-1" standalone="no" ?>  
  
<dateisammlung>  
  
<datei url="/C:/Users/test.xml"/>  
  
</dateisammlung>

Könnt ihr mir evtl. helfen... Ich verstehe nicht, wie ich alle hits bei gleicher @id und @page je durchgang zählen kann...?!

Vielen Dank schonmal..!

Gruß,
Dixi86

  1. Hallo,

    ich finde den Ansatz falsch, dass in XSL tun zu wollen. Ich denke, die Auswertung sollte vorher stattfinden und die Ergebnisse ins XML eingetragen werden. z.B. so (je nach Aufagbenstellung):

    <hit page="PAG1" hits="2012"></hit>
    <hit page="PAG2" hits="13"></hit>
    <hit page="PAG3" hits="456"></hit>
    <hit page="PAG4" hits="786"></hit>

    Grüße
    Siri

    1. Hallo Siri,
      Danke für deine Antwort... Leider ist die XML-Struktur vorgegeben. Insgesamt ist die ganze XML-Struktur auch ewig komplex, habe jetzt auch nur eine vereinfachte Version hier gepostet.
      Aber sollte meine Anforderung doch auch in XSL/XPath umsetzbar sein, oder?

      Gruß,
      Dixi86

      1. Hallo,

        dann schau Dir mal http://de.selfhtml.org/xml/darstellung/xsltelemente.htm#key@title=xsl:key an. Damit könntest Du "gruppieren", über eine Schleife rennen, das jeweilige Attribut abfragen und damit wieder die Knoten der Elemente zählen, die dem Attribut entsprechen.

        Grüße
        Siri

        1. Weiß nicht, ob du das so gedacht hast, aber so bekomme ich eine ausgabe :)

          <?xml version="1.0" encoding="utf-8"?>  
          <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
              <xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>  
               <xsl:template match="dateisammlung">  
                  <html xmlns="http://www.w3.org/1999/xhtml">  
                      <head>  
                          <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>  
                          <title>Test</title>  
                      </head>  
                      <body>  
                      	<font face="Arial" size="-1">  
                      	<table border="1">  
                      	<tr>  
                      	    <td align="center">Datum Auftragseingang</td>  
                      	    <td align="center">Dateiname</td>  
                      	    <td align="center">Seiten</td>  
          		    <td align="center">Anzahl Objekte/Seite</td>  
                      	</tr>  
                       <xsl:apply-templates select="datei/document(@url)//results"/>  
                          </table>  
                          </font>  
                      </body>  
                  </html>  
              </xsl:template>  
            
              <xsl:key name="hit" match="hit" use="@page"/>  
            
              <xsl:template match="report//results">  
                   <tr>  
              	<!-- Auftragseingang -->  
              	     <td><xsl:value-of select="//document/doc_info/created"/></td>  
              	<!-- Dateiname -->  
              	     <td><xsl:value-of select="//document/doc_info/filename"/></td>  
              	<!-- Seitenanzahl -->  
              	     <td><xsl:value-of select="//document/pages/count(//page)"/></td>  
                       <td><xsl:value-of select="count(//hit/@page)"/></td> 			   		  
            
              	<!-- Ist Anzahl der Objekte -->  
           	          <xsl:for-each select="//pages/page">  
           	 <tr>  
           			<xsl:variable name="Seite">  
          	 			<xsl:value-of select="./@id"/>  
          		        </xsl:variable>  
            
          		<td></td>  
          		<td></td>  
              		<td><xsl:value-of select="$Seite"/></td>  
              		<td><xsl:value-of select="count(key ('hit', $Seite))"/></td>  
              						  
              	</tr>  
              					  
          		</xsl:for-each>  
          	</tr>  
              </xsl:template>  
            
            
            
          </xsl:stylesheet>
          
          1. Weiß nicht, ob du das so gedacht hast, aber so bekomme ich eine ausgabe :)

            Prima! So war's gedacht :-)