Avatar billede clausn Nybegynder
28. maj 2008 - 15:59 Der er 6 kommentarer og
1 løsning

For each in XML / XLS fil

Hej eksperter,

Jeg har brug for at få noget data fra en XML ud i CSV format til videre behandling.

Jeg har følg. XML fil:

-----------------
<machines>
<machine>
  <host_name>COMPUTERNAVN</host_name>
  <computer_name>COMPUTERNAVN</computer_name>
  <windows_domain_name>WINDOWSDOMÆNE</windows_domain_name>
  <cpu_speed>3400</cpu_speed>
  <cpu_type>Intel(R) Xeon(TM) CPU 3.40GHz</cpu_type>
  <ram>3583</ram>
  <network_settings>
  <adapter>
    <name>HP NC7782 Gigabit Server Adapter #2</name>
    <ip_type>static</ip_type>
    <ip_address>10.1.1.21</ip_address>
    <mac_address>00:00:00:00:00:00</mac_address>
    <subnet_masks>255.255.254.0</subnet_masks>
    <gateway>10.1.1.254</gateway>
  </adapter>
  </network_settings>
  <services>
  <name>Alerter</name>
  <name>WinHTTP Web Proxy Auto-Discovery Service</name>
  <name>Wireless Configuration</name>
  <name>WMI Performance Adapter</name>
  <name>Workstation</name>
  <name>World Wide Web Publishing Service</name>
  </services>
  <software>
  <name>Security Update for Windows Server 2003 (KB896422)</name>
  <name>Security Update for Windows Server 2003 (KB899588)</name>
  <name>Security Update for Windows Server 2003 (KB913446)</name>
  <name>Security Update for Windows Server 2003 (KB914388)</name>
  <name>Security Update for Windows Server 2003 (KB917159)</name>
  </software>
</machine>
</machines>
-----------------

(en masse er fjernet af hensyn til pladsen!)

Derudover har jeg følg. XSL fil:
-----------------
<?xml version="1.0"?>
<xsl:stylesheet version = "1.0"
    xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements = "machines"/>
<xsl:template match="machine">
<xsl:text/>

<xsl:value-of select="normalize-space(host_name)"/>;<xsl:text/>
<xsl:value-of select="normalize-space(ram)"/>;<xsl:text/>
<xsl:value-of select="normalize-space(network_settings/adapter/ip_address)"/>;<xsl:text/>

<xsl:for-each select="services">
    <xsl:value-of select="name"/>|<xsl:text/>
</xsl:for-each>

<xsl:for-each select="software">
    <xsl:value-of select="normalize-space(name)"/>|<xsl:text/>
</xsl:for-each>

<xsl:value-of select="normalize-space(computer_name)"/>;&#10;<xsl:text/>
<xsl:text disable-output-escaping = "yes" >
</xsl:text>
</xsl:template>
</xsl:stylesheet>
-----------------

Det er Services og Software jeg ikke kan få ud - jo, den første post kommer, men så kommer der ikke flere! Jeg har prøvet at søge rundt på nettet,
men kan simpelthen ikke finde nogle steder hvor der står dette beskrevet.


Jeg har et VBS script som bruger både XML og XSL filen til at gemme det som en CSV fil.

Takker

Hilsen
Claus
Avatar billede clausn Nybegynder
28. maj 2008 - 16:05 #1
Jeg har prøvet med dette:

<xsl:for-each select="services">
    <xsl:value-of select="normalize-space(.)"/>;<xsl:text/>
</xsl:for-each>

Det giver mig indholdet af ALT i services, men uden ; som skulle stå efter hver service!
Avatar billede arne_v Ekspert
29. maj 2008 - 02:49 #2
Prøv med:

<xsl:for-each select="services/name">
    <xsl:value-of select="."/>|<xsl:text/>
</xsl:for-each>

<xsl:for-each select="software/name">
    <xsl:value-of select="normalize-space(.)"/>|<xsl:text/>
</xsl:for-each>
Avatar billede arne_v Ekspert
29. maj 2008 - 02:49 #3
Iøvrigt er jeg lidt skeptisk overfor CSV med variabelt antal felter, men ...
Avatar billede clausn Nybegynder
29. maj 2008 - 18:44 #4
Hej arne_v,

FANTASTISK!

Et tillægs spørgsmål:

<xsl:for-each select="services/name">
  <xsl:value-of select="normalize-space(.)"/>|<xsl:text/>
</xsl:for-each>

Kan man fjerne det sidste | som bliver tilføjet listen?

Altså "værdi-1"

Takker

- smider du et svar? :)

Hilsen
Claus
Avatar billede arne_v Ekspert
30. maj 2008 - 02:46 #5
<xsl:for-each select="services/name">
    <xsl:value-of select="."/><xsl:if test="position() != last()">|<xsl:text/></xsl:if>
</xsl:for-each>

<xsl:for-each select="software/name">
    <xsl:value-of select="normalize-space(.)"/><xsl:if test="position() != last()">|<xsl:text/></xsl:if>
</xsl:for-each>
Avatar billede arne_v Ekspert
30. maj 2008 - 02:46 #6
og et svar
Avatar billede arne_v Ekspert
08. juni 2008 - 17:48 #7
så mangler du bare at acceptere svaret
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester