![]() |
SELFHTML Forumsarchiv |
|
|
Die folgende Nachricht zum Thema stammt von: 26Ksimon86, 30. 04. 2008, 11:15
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...
Die folgende Nachricht zum Thema stammt von: ThomasM, 30. 04. 2008, 18:01
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
Die folgende Nachricht zum Thema stammt von: 26Ksimon86, 01. 05. 2008, 09:03
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
Die folgende Nachricht zum Thema stammt von: ThomasM, 01. 05. 2008, 10:43
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
Die folgende Nachricht zum Thema stammt von: 26Ksimon86, 01. 05. 2008, 11:40
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
© 1998-2006
Impressum, Software: Classic Forum