26Ksimon86: Auflistung der Knoten

Hallo,

Ich habe folgendes Problem. Und zwar habe ich folgende XML Datei
<rule id="73">
  <name>...</name>
  <comment>....</comment>
 <rulesets>
  <ruleset ruleset_id="171"/>
       </rulesets>
</rule>
<rule id="74">
   <name>A...</name>
   <comment>....</comment>
 <rulesets>
  <ruleset ruleset_id="172"/>
 </rulesets>
</rule>-----------------------weiter unten---------
   <ruleset id="171" ">
    <name>...</name>
    <comment>....</comment>
    <rules>
     <rule rule_id="73"></rule>
    </rules>
   </ruleset>
   <ruleset id="172">
    <name>...</name>
    <comment>....</comment>
    <rules>
     <rule rule_id="74"></rule>
    </rules>

-----------und dann------------------------
 <results>
  <hits rule_id="73">
   </hit>
  </hits>
  <hits rule_id="74">
   </hit>
  </hits>
       <results>

Die ids der Rule und rulesets sind von XML-Datei zu XML-Datei unterschiedlich. Ich möchte immer den Inhalt der names und displays der in resultats/hits aufgelisteten rules/rulesets ausgeben.
Dazu habe ich folgenden XSL Versuch...

<xsl:param name="HitsRule" select="//results/hits/@rule_id"/>
     xsl:for-each  select="//results/hits"
<ul type="disc">
             <li><b><xsl:value-of select="//rulesets/ruleset/rules/rule[@rule_id=current()/$HitsRule]/parent::node()/preceding-sibling::name"/></b></li>

<li><xsl:value-of select="//rulesets/ruleset/rules/rule[@rule_id=current()/$HitsRule]/parent::node()/preceding-sibling::comment"/></li>

<li><xsl:value-of select="//rules/rule[@id=current()/$HitsRule]/name"/></li>
</ul>
     </xsl:for-each>

Leider werden mir die Inhalte zweimal komplett zusammen ausgegeben. Ich möchte aber das die beiden hits jeweils nach der id geordnet aufgelistet werden. Hat jemand einen Tipp für mich wie ich das mit XSL oder XPath lösen kann??
Ich hoffe mein anliegen ist verständlich...

  1. Hallo 26Ksimon86,

    <li><b><xsl:value-of select="//rulesets/ruleset/rules/rule[@rule_id=current()/$HitsRule]/parent::node()/preceding-sibling::name"/></b></li>

    In [@rule_id=current()/$HitsRule] wird $HitsRule nicht ersetzt, wie vielleicht erwartet. Vermutlich ist eher .../[@rule_id=$HitsRule]/... gesucht. Falls das nicht hilft, poste jeweils abgespeckte, aber testfähige, XML- und XSL-Fragmente.

    Grüße,
    Thomas

    1. Hallo Thomas...
      Hier noch die geforderten xml und xsl...

      <?xml version="1.0" encoding="UTF-8"?>
      <report>
          <rule id="3">
              <name>Name aus rule3</name>
              <comment>comment aus rule3</comment>
              <rulesets>
                  <ruleset ruleset_id="102">
                  </ruleset>
              </rulesets>
          </rule>
          <rule id="99">
              <name>Name aus rule99</name>
              <comment>comment aus rule99</comment>
              <rulesets>
                  <ruleset ruleset_id="128">
                  </ruleset>
              </rulesets>
          </rule>
          <ruleset id="102">
              <name>Name aus Ruleset102</name>
              <comment>comment aus ruleset102</comment>
              <rules>
                  <rule rule_id="3"></rule>
                  <rule rule_id="4"></rule>
                  <rule rule_id="2"></rule>
              </rules>
          </ruleset>
          <ruleset id="128">
              <name>Name aus ruleset128</name>
              <comment>comment aus Rule128</comment>
              <rules>
                  <rule rule_id="98"></rule>
                  <rule rule_id="99"></rule>
                  <rule rule_id="100"></rule>
                  <rule rule_id="97"></rule>
              </rules>
          </ruleset>
          <results>
              <hits rule_id="99"/>
              <hits rule_id="3"/>
          </results>
      </report>

      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
          <xsl:template match="/">
                  <html>
                      <head>
                      </head>
                      <body><xsl:apply-templates select="//results"/>
                      </body>
                  </html>
          </xsl:template>

      <xsl:template match="results">
              <xsl:param name="HitsRule" select="//results/hits/@rule_id"/>
              <p><b>Resultate</b></p>
              <xsl:for-each select="//results/hits">
                  <ul type="disc">
      <li>
      <xsl:value-of select="//ruleset/rules/rule[@rule_id=$HitsRule]/parent::node()/preceding-sibling::name"/>
      </li>
      <li>
      <xsl:value-of select="//ruleset/rules/rule[@rule_id=$HitsRule]/parent::node()/preceding-sibling::comment"/>
      </li>
                      <li><xsl:value-of select="//rule[@id=$HitsRule]/name"/></li>
                  </ul>
              </xsl:for-each>
          </xsl:template>

      </xsl:stylesheet>

      Ich denke beim ausführen ist schnell ersichtlich was mein Problem ist... eigentlich könnte ich die Ausgabe ja auch über die Position steuern allerdings ist die Anzahl der results/hits immer unterschiedlich..

      Vielen Dank für deine/eure Hilfsbereitschaft

      simon

      1. Hallo 26Ksimon86,

        Ich denke beim ausführen ist schnell ersichtlich was mein Problem ist...

        Versuch:

        <?xml version="1.0" encoding="UTF-8"?>  
        <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">  
          
          <xsl:template match="report">  
            <html>  
              <head>  
                <title>Test</title>  
              </head>  
              <body>  
                <xsl:apply-templates select="results"/>  
              </body>  
            </html>  
          </xsl:template>  
          
          <xsl:template match="results">  
            <p>  
              <b>Resultate</b>  
            </p>  
            <xsl:for-each select="hits">  
              <xsl:variable name="HitsRule" select="@rule_id"/>  
              <ul type="disc">  
                <li>  
                  <xsl:value-of select="//ruleset/rules/rule[@rule_id=$HitsRule]/parent::node()/preceding-sibling::name"/>  
                </li>  
                <li>  
                  <xsl:value-of select="//ruleset/rules/rule[@rule_id=$HitsRule]/parent::node()/preceding-sibling::comment"/>  
                </li>  
                <li>  
                  <xsl:value-of select="//rule[@id=$HitsRule]/name"/>  
                </li>  
              </ul>  
            </xsl:for-each>  
          </xsl:template>  
          
        </xsl:stylesheet>
        

        Grüße,
        Thomas

        1. Perfekt!! Es hat funktioniert... allerdings habe ich nicht verstanden warum es nicht mit xsl:param und current funktioniert hat?!

          Aber trotzdem noch mal vielen Dank

          Simon