Avatar billede janborup Praktikant
14. januar 2003 - 13:56 Der er 4 kommentarer og
1 løsning

XML til Kommafil eller XSL

Hej

Jeg følgende XML fil som jeg gerne vil have kovateret til en kommafil.


<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <dbo.Article StyleNo="024-10" Season="2003-1" Supplier="EAT TRD" Material="PU" SampleSize="37" LastNo="024" Heel="024" Outsole="Q&Q (PVC)" Origin="Vietnam">
  <dbo.ArtCustomer SockMain="PVC" LiningMain="TRICOT" LiningSecond="PVC" Logo="Franco Banetti">
  <dbo.ArtSize Size_Interval="36-42">
  <dbo.ArtColor Color="Black WL-38927" />
  <dbo.ArtColor Color="Lt.Brown WL-38914" />
  <dbo.ArtColor Color="Kit WL-38907" />
  <dbo.ArtColor Color="White WL-38902" />
  </dbo.ArtSize>
  </dbo.ArtCustomer>
  </dbo.Article>
</ROOT>

Jeg har prøvet at lave en XSL fil, men problemet er jeg ikke kan få de nested <xsl:for-each> til at virke, så alle felter kommer med hvergang, hvis der er flere af samme undertabel.

<?xml version="1.0" encoding="UTF-8"?>         
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">   
  <xsl:template match = "/">                             
      <HTML>                                                 
      <HEAD>                                               
      <STYLE>
      TH
      {
        background-color: #CCCCCC;
      }
      </STYLE>   
      </HEAD>
      Comma delimeted file
      <BODY>

<xsl:for-each select="/ROOT/dbo.Article">
<p>
"<xsl:value-of select="@StyleNo"/>",
"<xsl:value-of select="@Season"/>",
"<xsl:value-of select="@Supplier"/>",
"<xsl:value-of select="@Material"/>"
"<xsl:value-of select="@SampleSize"/>",
"<xsl:value-of select="@LastNo"/>",
"<xsl:value-of select="@Heel"/>",
"<xsl:value-of select="@Outsole"/>",
"<xsl:value-of select="@Origin"/>",
    <xsl:for-each select="/ROOT/dbo.Article/dbo.ArtCustomer">
    "<xsl:value-of select="@SockMain"/>",
    "<xsl:value-of select="@SockSecond"/>",
    "<xsl:value-of select="@LiningMain"/>",
    "<xsl:value-of select="@LiningSecond"/>",
    "<xsl:value-of select="@Logo"/>",
        <xsl:for-each select="/ROOT/dbo.Article/dbo.ArtCustomer/dbo.ArtSize">
        "<xsl:value-of select="@Size_Interval"/>",
            "<xsl:value-of select="@Logo"/>",
                <xsl:for-each

select="/ROOT/dbo.Article/dbo.ArtCustomer/dbo.ArtSize/dbo.ArtColor">
                "<xsl:value-of select="@Color"/>",
            </xsl:for-each>                                       
        </xsl:for-each>                                       
    </xsl:for-each>                                       
</p>
</xsl:for-each>                                       

    </BODY>
    </HTML>                                     

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


Restulatat skulle gerne se således ud:
--------------------------------------
Comma delimeted file
"024-10", "2003-1", "EAT TRD", "PU" "37", "024", "024", "Q&Q (PVC)", "Vietnam", "PVC", "", "TRICOT", "PVC", "Franco Banetti", "36-42", "", "Black WL-38927"

"024-10", "2003-1", "EAT TRD", "PU" "37", "024", "024", "Q&Q (PVC)", "Vietnam", "PVC", "", "TRICOT", "PVC", "Franco Banetti", "36-42", "", "Lt.Brown WL-38914"

"024-10", "2003-1", "EAT TRD", "PU" "37", "024", "024", "Q&Q (PVC)", "Vietnam", "PVC", "", "TRICOT", "PVC", "Franco Banetti", "36-42", "", "Kit WL-38907"

"024-10", "2003-1", "EAT TRD", "PU" "37", "024", "024", "Q&Q (PVC)", "Vietnam", "PVC", "", "TRICOT", "PVC", "Franco Banetti", "36-42", "", "White WL-38902"


Hvis man ikke kan gøre det i XSL, kan nogen så anbefale et program der kan dette. ???
Avatar billede janegil Nybegynder
14. januar 2003 - 14:24 #1
Tror du
<xsl:for-each select="/ROOT/dbo.Article/dbo.ArtCustomer/dbo.ArtSize">
skal endres til
<xsl:for-each select="dbo.ArtSize">
hvis løkken bare skal ta ArtSize som er inne i den nåværende ArtCustomer?
Avatar billede atoft Nybegynder
29. januar 2003 - 20:22 #2
Hej,

Du skal "bare" gøre følgende:

efter <BODY> taget laver du kun en for-each, sådan her.

<xsl:for-each select="//dbo.ArtColor">
    <!-- her henter du teksterne på forældrerne -->
    "<xsl:value-of select="ancestor::dbo.Article@StyleNo" />",
    :
    :
    "<xsl:value-of select="ancestor::dbo.ArtCustomer@StyleNo" />",
    :
    :
    "<xsl:value-of select="ancestor::@Color" />",

</xsl:for-each>

Du må selv lige tilføje de manglende value-of'er

Håber det kan bruges.
Avatar billede davidchristensen Praktikant
15. marts 2003 - 12:35 #3
hmm..

jeg ville nok skrive:

<xsl:template select="/">
  <xsl:apply-templates selcet="dbo.article" />
</xsl:template>

<xsl:template match="dbo.article"/>
  "<xsl:value-of select="*">",
  "<xsl:value-of select="@*">",
    <xsl:apply-templates select="dbo.Artsize"/>
</xsl:template>

<xsl:template match="dbo.Artsize"/>
  "<xsl:value-of select="*">",
  "<xsl:value-of select="@*">",
</xsl:template>

..eller cirka deromkring..

med andre ord så behøver du ikke at skrive navnene på alle de elementer du vil transformere, men sådan en stjerne betyder dem allesammen i pågældende niveau parseren er i.. I 2. template vælger du noden under den aktuelle node og også alle dens attributter.. Jeg kan så ikke lige gennemskue om stylesheetet her skal laves rekursivt eller om det vil fungere sådanher..

David
-
Avatar billede davidchristensen Praktikant
15. marts 2003 - 12:49 #4
btw. i den øverste template står der select hvor der burde stå match.. og så er der stavefejl i select lige nedenunder..
Avatar billede davidchristensen Praktikant
15. marts 2003 - 12:53 #5
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

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