Toon posts:

[XML] XML beinvloeden mbv XSLT

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik probeer nu al een tijdje de ServerStatusReport.xml afkomstig van mn Win2000SBS server er anders uit te laten zien.

Met dank aan w3schools.org en wat zoeken hier lukt dat al aardig, echter loop ik tegen een probleem op, for-each weigert te werken omdat de gegenereerde XML niet helemaal volgens de regeltjes gemaakt is.

hier een beknipte versie ervan om jullie een beetje een beeld te geven:)

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0"?>
<server_stat_report>
<report_info>
<customer_name></customer_name>
<date>6/6/2006</date>
<time>6:00:04 AM</time>
</report_info>
<server_grp_blk>
<server_grp_name></server_grp_name>
<server_status><server_name>GRAASVELD</server_name><Microsoft_HMSystemStatus_State>0</Microsoft_HMSystemStatus_State>
<Win32_PerfRawData>Performance Counters
<Win32_PerfRawData_Name>Memory - Available Bytes</Win32_PerfRawData_Name><Win32_PerfRawData_Value>3805184</Win32_PerfRawData_Value>
<Win32_PerfRawData_Name>Memory - Committed Bytes</Win32_PerfRawData_Name><Win32_PerfRawData_Value>711294976</Win32_PerfRawData_Value>
<Win32_PerfRawData_Name>Memory - Pool Nonpaged Bytes</Win32_PerfRawData_Name><Win32_PerfRawData_Value>17756160</Win32_PerfRawData_Value>
<Win32_PerfRawData_Name>Memory - Cache Faults/sec</Win32_PerfRawData_Name><Win32_PerfRawData_Value>2 </Win32_PerfRawData_Value>
<Win32_PerfRawData_Name>Memory - Page Faults/sec</Win32_PerfRawData_Name><Win32_PerfRawData_Value>209 </Win32_PerfRawData_Value>
<Win32_PerfRawData_Name>Memory - Page Reads/sec</Win32_PerfRawData_Name><Win32_PerfRawData_Value>1 </Win32_PerfRawData_Value>
<Win32_PerfRawData_Name>Memory - Pages Input/sec</Win32_PerfRawData_Name><Win32_PerfRawData_Value>15 </Win32_PerfRawData_Value>
<Win32_PerfRawData_Name>Memory - Pages/sec</Win32_PerfRawData_Name><Win32_PerfRawData_Value>15 </Win32_PerfRawData_Value>
<Win32_PerfRawData_Name>Memory - % Free Memory</Win32_PerfRawData_Name><Win32_PerfRawData_Value>0 </Win32_PerfRawData_Value>
</Win32_PerfRawData>
<Win32_Service>Service Status
<State>Running</State><StartMode>Auto</StartMode><DisplayName>Alerter</DisplayName>
<State>Stopped</State><StartMode>Manual</StartMode><DisplayName>Application Management</DisplayName>
<State>Stopped</State><StartMode>Manual</StartMode><DisplayName>ASP.NET State Service</DisplayName>
</Win32_Service>
<Microsoft_HMRuleStatus>Alerts
</Microsoft_HMRuleStatus></server_status></server_grp_blk>
</server_stat_report>


ik roep hierbij een xsl op die een xsl:for-each gebruikt om van de <Win32_PerfRawData> elke keer de <Win32_PerfRawData_Name> en <Win32_PerfRawData_Value> naast elkaar te zetten in <div>'s
Echter omdat de bron XML niet elke regel start met een <Win32_PerfRawData> en eindigd met een </Win32_PerfRawData> werkt for each niet. En dus weergeeft het resultaat alleen de 1e regel uit <Win32_PerfRawData> en daarna vind ie dat ie klaar is.

Ik ben er redelijk nieuw in maar vind maar geen oplossing of workaround, heb al geprobeerd een repeat te gebruiken maar ook dat mocht niet helpen.

Ik ben benieuwd of iemand hier me wat pointers kan geven zodat ik verder kan zoeken of zelfs een oplossing (al dokter ik t liever zelf uit :+ )

  • Vedett.
  • Registratie: November 2005
  • Laatst online: 19-02 19:21
mmm

XSLT is bij mij al een tijdje geleden. Maar wat ik me er van kon herinneren is; dat je templates kon maken voor een element. Volgens mij heb je helemaal geen for-each nodig.


Ik denk dat je hier even moet kijken (Dus toch een for-each. Hoewel ik nog altijd denk dat het zonder ook kan)
http://www.w3schools.com/xsl/xsl_for_each.asp


Edit 4
Inderdaad: ook zonder een for-each is het mogelijk
http://www.w3schools.com/xsl/xsl_apply_templates.asp

[ Voor 48% gewijzigd door Vedett. op 08-06-2006 11:08 ]


  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 19-02 23:40

Nick_S

++?????++ Out of Cheese Error

Volgens mij ging het er meer om, dat het lastig is om de volgende value node te vinden bij een name, maar hiermee moet het lukken:
XML:
1
2
3
4
5
6
7
8
9
10
11
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
    <xsl:for-each select="//Win32_PerfRawData_Name">
        Name: <xsl:value-of select="./text()"/>
        Value: <xsl:value-of select="./following-sibling::Win32_PerfRawData_Value[1]/text()"/>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Verwijderd

Topicstarter
bedankt voor de linkjes en ik heb uiteindelijk aan de hand van Nick_S zn voorbeeld het een en ander werkend gekregen

Afbeeldingslocatie: http://fluitje.xs4all.nl/ctc/temp/statxmlwerkt.png

ziet er niet uit natuurlijk maar wilde t ff snel laten zien dat t werkt :)

bedankt mensen!

  • Vedett.
  • Registratie: November 2005
  • Laatst online: 19-02 19:21
Ik zou toch eens naar die apply-templates kijken. Lijkt mij veeel gemakkelijker en duidelijker

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
ik zoek het idd zo doen, xsl:for-each kan vaak wel maar wordt in XSL in veel gevallen als bad-practise gezien.

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" > 
    
    <xsl:template match="/">
        <xsl:apply-templates select="//Win32_PerfRawData" />
    </xsl:template>
    
    <xsl:template match="Win32_PerfRawData">
        <table border="1">
            <tr>
                <th colspan="2">
                    <xsl:value-of select="text()" />
                </th>
            </tr>
            <xsl:apply-templates select="Win32_PerfRawData_Name" />
        </table>        
    </xsl:template>
    
    <xsl:template match="Win32_PerfRawData_Name">
        <tr>
            <td>
                <xsl:value-of select="." />
            </td>
            <td>
                <xsl:value-of select="following-sibling::Win32_PerfRawData_Value/text()" />
            </td>
        </tr>
    </xsl:template>
        
</xsl:stylesheet>

[ Voor 77% gewijzigd door Genoil op 08-06-2006 12:41 ]


Verwijderd

Topicstarter
Dit is voor mij het begin om verder te kijken :)

ik heb nu een aardige lap tekst, maar het doet wel wat ik wil :+

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
<body style="font-family:Arial,helvetica,sans-serif;font-size:12pt;background-color:#EEEEEE">
<div><h1>Server Status Rapport <xsl:value-of select="//server_name"/></h1></div>
<div><span style="font-weight:bold;color:black">Rapportagedatum: </span> <span style="font-weight:italic;color:black"><xsl:value-of select="//date"/></span></div>
<div><span style="font-weight:bold;color:black">Rapportagetijdstip: </span> <span style="font-weight:italic;color:black"><xsl:value-of select="//time"/></span></div>
<br></br>
<div><span style="font-weight:bold;color:black">Performance gegevens:</span></div>
<table border="0">
<tr style="background-color:#8fbc8f;color:#2f4f4f;padding:4px">
<td style="font-weight:bold">Omschrijving:</td>
<td style="font-weight:bold">Waarde:</td>
</tr>
    <xsl:for-each select="//Win32_PerfRawData_Name"> 
        <tr style="background-color:#d2b48c;color:#800000;padding:4px"><td style="font-weight:bold"><xsl:value-of select="./text()"/></td>
        <td style="font-weight:normal"><xsl:value-of select="./following-sibling::Win32_PerfRawData_Value[1]/text()"/></td>
        </tr>
    </xsl:for-each> 
    </table>
    <br></br>
<div><span style="font-weight:bold;color:black">Services:</span></div>
<table border="0">
<tr style="background-color:#8fbc8f;color:#2f4f4f;padding:4px">
<td style="font-weight:bold;">Status:</td>
<td style="font-weight:bold;">Startmode:</td>
<td style="font-weight:bold;">Omschrijving:</td>
</tr>
    <xsl:for-each select="//State"> 
        <tr style="background-color:#d2b48c;color:#800000;padding:4px"><td style="font-weight:bold"><xsl:value-of select="./text()"/></td>
        <td style="font-weight:normal"><xsl:value-of select="./following-sibling::StartMode[1]/text()"/></td>
        <td style="font-weight:normal"><xsl:value-of select="./following-sibling::DisplayName[1]/text()"/></td>
        </tr>
    </xsl:for-each> 
    </table>

    </body>
</xsl:template> 
</xsl:stylesheet>


De code is uiteraard nog een zooi en ben zelfs te lui geweest om op de html e/d te letten, laat staan CSS te gebruiken..

maar t werkt :+

  • Vedett.
  • Registratie: November 2005
  • Laatst online: 19-02 19:21
En dan van het volgenden ook nog een template maken uiteraard

<td>
<xsl:value-of select="following-sibling::Win32_PerfRawData_Value/text()" />
</td>

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Vedett. schreef op donderdag 08 juni 2006 @ 13:14:
En dan van het volgenden ook nog een template maken uiteraard

<td>
<xsl:value-of select="following-sibling::Win32_PerfRawData_Value/text()" />
</td>
mja maar dan wordt het xpath van de apply-templates vrijwel net zo complex als bovenstaande, dus had ik het maar zo gelaten :)

  • Vedett.
  • Registratie: November 2005
  • Laatst online: 19-02 19:21
Dan heb je helemaal geen xpath nodig!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Overigens is dit ook bad practice:

XML:
1
<server_grp_name></server_grp_name> 


Beter:
XML:
1
<server_grp_name />


Het is feitelijk precies hetzelfde, maar het kan dus zo zijn dat de parser fysiek je code gaat lopen wijzigen naar de tweede vorm :)

[ Voor 3% gewijzigd door BtM909 op 14-06-2006 09:45 ]

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 19-02 23:40

Nick_S

++?????++ Out of Cheese Error

BtM909 schreef op woensdag 14 juni 2006 @ 09:45:
Overigens is dit ook bad practice:

XML:
1
<server_grp_name></server_grp_name> 


Beter:
XML:
1
<server_grp_name />


Het is feitelijk precies hetzelfde, maar het kan dus zo zijn dat de parser fysiek je code gaat lopen wijzigen naar de tweede vorm :)
Waarschijnlijk heeft de TS daar geen invloed op, aangezien dit feitelijke uitvoer van een ander programma is.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'

Pagina: 1