Just nu i M3-nätverket
Gå till innehåll

XML


Lindacharlotta

Rekommendera Poster

Lindacharlotta

Jag har en xml-sida med info, kan jag på något sätt visa upp informationen på en html-sida?

Vill inte visa taggarna utan bara info mellan taggarna.

Vad behöver jag för att html ska kunna avläsa xml-sidan?

Någon som kan ge mig en hint var jag kan hitta information om detta, gör mig glad... :-)

 

Tack på förhand!

 

Mvh Linda

 

Länk till kommentar
Dela på andra webbplatser

Jag brukar använda något som heter xslt. Det är ett "stylesheet" som gör om xml till html.

 

Det finns oftast stöd för xslt inbyggt i webläsare. Men om man vill så kan man använda komponenter på webservern som gör själva omvandlingen åt en.

 

För att tipsa om hur du gör på servern så får du först förklara om du har något scriptspråk installerat, tillexempel asp eller php eller liknande.

 

Sen finns här en resurs som beskriver xslt med massor av exempel.

 

http://www.zvon.org/xxl/XSLTreference/Output/

 

Länk till kommentar
Dela på andra webbplatser

Lindacharlotta

XHTML-sidan måste kunna ses av alla och i alla webbläsare.

Vanlig ASP har jag kört tidigare, så det finns installerat.

 

Vilket är bäst att använda sig utav?

 

Linda

 

Länk till kommentar
Dela på andra webbplatser

Jag brukar faktiskt använda komponenterna som är inbyggda i ASP. Fungerar oftast finfint.

 

Kort exempel:

Dim xml
Dim xsl
Dim html

Set xml = Server.CreateObject("MSXML2.DomDocument")
xml.Async = false
xml.Load(Server.MapPath("xmlsida.xml"))

Set xsl = Server.CreateObject("MSXML2.DomDocument")
xsl.Async = false
xsl.Load(Server.MapPath("xslsida.xsl"))

html = xml.TransformNode(xsl)

I Exemplet så kommer html få din html-kod som en vanlig sträng. Och den kan du skriva ut med Response.Write. Beroende på hur du väljer att skriva din xsl så kan du göra en hel sida, eller en del av en sida. Tillexempel bara en tabell.

 

Länk till kommentar
Dela på andra webbplatser

Lindacharlotta

Vad är skillanden mellan denna koden och din:

 

http://www.stardeveloper.com/articles/display.html?article=2000072801&page=2

 

<%
Option Explicit
Response.Buffer = True

Dim xml
Set xml = Server.CreateObject("Microsoft.XMLDOM")
xml.async = False
xml.load (Server.MapPath("page.xml"))

Dim title, heading, paragraph, testHTML
title = xml.documentElement.childNodes(0).text
heading = xml.documentElement.childNodes(1).text
paragraph = xml.documentElement.childNodes(2).text
testHTML = xml.documentElement.childNodes(3).text

Set xml = Nothing
%>
<html>
<head>
<title><%= title %></title>
</head>
<body>
<h3 align="center"><%= heading %></h3>
<p align="center"><% = paragraph %></p>
<div align="center"><%= testHTML %></div>
</body>
</html>

Vill bara förstå det hela och inte bara kopiera kod... :-)

 

[inlägget ändrat 2008-11-27 11:26:53 av Lindacharlotta]

Länk till kommentar
Dela på andra webbplatser

Skillnaden är väll främst att dom har valt att hämta element för element och presentera värdet av detta från xml-koden.

 

Klart görbart, men jag tycker personligen att det är "lite knepigt". Till exempel är xml.documentElement.childNodes(2).text ganska obegripligt. Men i xsl så kan du beskriva det som /boklista/bok/titel tillexempel. Något som jag tycker är enklare.

 

Länk till kommentar
Dela på andra webbplatser

Lindacharlotta

Ok, jag har byggt upp den som du har gjort och det fungerar jättebra..Förutom en liten sak... :-)

 

Tggen nedan finns i xml filen som skapas och den vägrar köra sålänge jag har xmlns="Bilmodell" med. Vad är det för tagg och vad gör den?

 

<SearchD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="Bilmodell">

 

Tar jag bort den så fungerar som jag sagt allting bra.

Tyvärr måste jag ha den... :-(

 

Sedan en fråga till om jag vill ändra font och storlek är det i XSL-dok jag skriver in den, isåfall vad skriver jag?

 

Tack på förhand... :-)

 

Linda

 

Länk till kommentar
Dela på andra webbplatser

xmlns är ett så kallat namespace. Men om jag ska vara helt ärlig så har jag glömt exakt vad det är bra för.

 

Och för att fnula med typsnitt och sånt så görs det i xsl. Xsl skapar ju html-kod så du gör ungefär på samma sätt som i html. Och css-klasser brukar vara det bästa.

<xsl:template match="/">
<span class="MyClass"><xsl:value-of select="/SearchD/title" /></span>
</xsl:template>

 

Länk till kommentar
Dela på andra webbplatser

Lindacharlotta

Ok, jag får googla vidare på den... Konstigt att inget visas om den finns.... :-(

 

Men skriver jag in värdena för MyClass i XSL med?

jag skulle vilja ha mindre storlek på fonten gällande i hela min tabell och varannan rad färgad?

 

/ Linda

 

Länk till kommentar
Dela på andra webbplatser

Att göra varannan rad färgad är inte så svårt. Dock får man skriva lite logik för att klura på om positionen på det aktuella elementet är jämn eller ojämn. Lite knepigt. Har dock för stunden ingen exempelkod för detta.

 

Värdena för MyClass skriver du i din css-mall. Men jag tycker att du ska börja med att få xsl-transformationen att fungera. På så vis ser du ju exakt hur html-koden ser ut och kan börja fylla på med css-klasser och liknande.

 

När du ser hur din xsl-kod beter sig och hur resultatet ser ut i html så blir det genast mycket enklare.

 

Länk till kommentar
Dela på andra webbplatser

Jonny Bergdahl

värdet för xmlns anger i vilket namespace en node ligger. Finns inget värde för xmlns angivet så ligger noden utanför namespace.

 

Problemet med detta är att det påverkar select-satsen i XSL.

 

/SearchD/title letar reda på noden title i en XML-fil UTAN namespace.

/prefix:Search/prefix:title letar reda på noden title i en XML-fil MED namespace, "prefix" är en alias som i ditt fall ska peka ut namespace "Bilmodell".

 

Jag jobbar inte i ASP längre, så jag är inte säker på hur det fungerar i MSXML2, men på http://www.roblocher.com/technotes/xmlnotes.aspx beskrivs en lösning.

 

Jag gissar att du behöver lägga till:

xsl.SetProperty("SelectionNamespaces", "xmlns:a='Bilmodell'");

 

Ändra sedan dina söksträngar så dom använder prefixet a:

<xsl:value-of select="/a:SearchD/a:title" />

 

Mvh;

/jb

 

Länk till kommentar
Dela på andra webbplatser

Lindacharlotta

Tack för svaret..

Men får det inte att fungera

 

Var lägger jag dennasträng? i xsl?

xsl.SetProperty("SelectionNamespaces", "xmlns:a='Bilmodell'");

 

Så här ser min xsl ut:

 

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method='html' version='1.0' encoding='UTF-8' indent='yes'/>
<xsl:SetProperty="SelectionNamespaces", "xmlns:a="Bilmodell">
<xsl:template match="/">
 <html>
 <head><title>Linda testar XML</title></head>
 <body>
  <xsl:for-each select="a:SearchD/a:SearchResults/a:TSearchResult">
<xsl:value-of select="fätett"/>
       	<xsl:value-of select="fälttva"/>
       	<xsl:value-of select="fälttre"/>
       	<xsl:value-of select="fältfyra"/>
 </xsl:for-each>
  </body>
 </html>
</xsl:template>
</xsl:stylesheet>

 

och min sträng i XML, som jag inte kan göra några ändringar i.:

<SearchD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="Bilmodell"> 

 

Verkligen fast, tacksam för hjälp...

 

/ Linda

 

Länk till kommentar
Dela på andra webbplatser

Jonny Bergdahl

Min gissning är att koden borde se ut så här:

 

Set xsl = Server.CreateObject("MSXML2.DomDocument")
xsl.Async = false
xsl.SetProperty("SelectionNamespaces", "xmlns:a='Bilmodell'");
xsl.Load(Server.MapPath("xslsida.xsl"))

 

Alternativt kan du istället prova att lägga till den i xsl-filen:

 

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:a="Bilmodell">

 

Sen måste du lägga till prefixet på samtliga select i xsl-filen, alltså även i "value-of"-noderna:

 

<xsl:value-of select="a:fätett"/>

 

Mvh;

/jb

 

Länk till kommentar
Dela på andra webbplatser

Lindacharlotta

Tack för att du hjälper mig..

 

Jag får detta körningsfelet i min asp-fil:

 

Feltyp:

Kompileringsfel i Microsoft VBScript (0x800A0414)

Det går inte att använda parenteser när en Sub anropas.

/test/SearchTest.asp, line 10, column 61

xsl.SetProperty("SelectionNamespaces", "xmlns:a='Bilmodell'");

------------------------------------------------------------^

Då min kod i ASP-dok ser ut:

<%

set xml = Server.CreateObject("Microsoft.XMLDOM")
xml.async = false
xml.load(Server.MapPath("SearchTest.xml"))


set xsl = Server.CreateObject("MSXML2.DomDocument")
xsl.async = false
xsl.SetProperty("SelectionNamespaces", "xmlns:a='Bilmodell'");
xsl.load(Server.MapPath("SearchTest.xsl"))


Response.Write(xml.transformNode(xsl))
%>

 

 

även om jag tar bort ; rfter bilmodell.

Har provat ta bort det i asp och lägga in det i XSL

 

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:a="Bilmodell">
<xsl:output method='html' version='1.0' encoding='UTF-8' indent='yes'/>

<html>
 <head><title>Linda testar om det fungerar</title></head>
 <body>



<table bgcolor="#eeeeee" border="1" width="550" bordercolor="#cccccc" cellpadding="0" cellspacing="0">
<tr>
	<td>
		<table>
			<tr>
				<td><span style="font-size:11px"><b>Pid: </b></span></td>
				<td><span style="font-size:11px"><xsl:value-of select="a:SearchD/a:SearchResults/a:SearchResult/a:Test"/></span></td>
			</tr>					
		</table>
	</td>
</tr>
</table>

</body>
</html>

 

Får då felkod:

Feltyp:

MsXml3.dll (0x80004005)

Formatmallen innehåller inte ett dokumentelement. Formatmallen kan vara tom eller så är det inte ett korrekt strukturerat XML-dokument.

/test/SearchTest.asp, line 14

Kan du se vad jag gör fel?

 

[inlägget ändrat 2008-11-28 10:31:10 av Lindacharlotta]

Länk till kommentar
Dela på andra webbplatser

Jonny Bergdahl

Sorry, har tydligen helt förträngt syntaxen i VBScript. :)

 

Ska väl stå nåt i stil med nedanstående istället.

 

xsl.SetProperty "SelectionNamespaces", "xmlns:a='Bilmodell'"

 

Vad gäller din XSL-fil saknas den avslutande taggen

<xsl:stylesheet>

.

 

Mvh;

/jb

 

Länk till kommentar
Dela på andra webbplatser

Lindacharlotta

Jag som hade stavat fel på ett fält... :-)

 

Tack för all din hjälp...

Du kanske har någon länk, spm ajg kan läsa mig till hur jag färgar varannan rad?

 

/Linda

 

[inlägget ändrat 2008-11-28 11:01:49 av Lindacharlotta]

Länk till kommentar
Dela på andra webbplatser

Jonny Bergdahl
KAn det vara några konstigheter med min sökväg:

 

Säkerligen, men det kan jag ju inte svara på utan att veta hur din XML-fil ser ut.

 

Mvh;

/jb

 

Länk till kommentar
Dela på andra webbplatser

Lindacharlotta

En liten fråga till: Den skriver ut alla värdena korrekt. Men jag vill ha en loopad lista, som fungerade bra innan. Men ska kanske:

<xsl:value-of select="a:SearchD/a:SearchResults/a:TSearchResult">se annorlunda ut för den skriver inte ut några resultat alls. & inget felmeddelande visas...?

 

<xsl:for-each [color="#ff0000"]select="a:SearchD/a:SearchResults/a:TSearchResult">[/color]

       <tr>
       	<td><span style="font-size:11px"><xsl:value-of select="a:SearchD/a:SearchResults/a:TSearchResult/a:Rid"/></span></td>
	<td><span style="font-size:11px"><xsl:value-of select="a:SearchD/a:SearchResults/a:TSearchResult/a:Orderer"/></span></td>
	<td><span style="font-size:11px"><xsl:value-of select="a:SearchD/a:SearchResults/a:TSearchResult/a:Status"/></span></td>
	<td><span style="font-size:11px"><xsl:value-of select="a:SearchD/a:SearchResults/a:TSearchResult/a:SampleDateTime"/></span></td>

</tr>

	</xsl:for-each>

 

Mvh Linda

 

Länk till kommentar
Dela på andra webbplatser

Jonny Bergdahl

Select-satsen i for-each "ställer" context på den hittad nod, så inne i loopen ska du hämta värdena relativt. Du kan också behöva lägga till en / först på select i for-each, beroende på var i din kod den ligger.

 

Båda exemplen nedan ska ge samma resultat.

 

<xsl:for-each select="/a:SearchD/a:SearchResults/a:TSearchResult">
 <xsl:text>Orderer:</xsl:text>
 <xsl:value-of select="a:Orderer"/>
</xsl:for-each>

 

<xsl:for-each select="/a:SearchD/a:SearchResults">
 <xsl:for-each select="a:TSearchResult">
   <xsl:text>Orderer:</xsl:text>
   <xsl:value-of select="a:Orderer"/>
 </xsl:for-each>
</xsl:for-each>

 

Länk till kommentar
Dela på andra webbplatser

Lindacharlotta

Tackar, det fungerade perfekt!

 

Tack för all din hjälp... :-)

 

Då passar jag på att ställa en sista fråga.. :-)

Varannan rad färg? vet du var jag kan läsa mig till info om det?

 

Mvh Linda

 

Länk till kommentar
Dela på andra webbplatser

Här kommer ett litet exempel.

xml-fil

<?xml version="1.0" encoding="UTF-8"?>
<minxml>
   <lista>
       <rad>Rad ett</rad>
       <rad>Rad två</rad>
       <rad>Rad tre</rad>
   </lista>
</minxml>

 

Xsl-fil

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <xsl:output method="html"/>
   <xsl:template match="/">
       <html>
           <head>
               <title/>
           </head>
           <body>
               <table>
                   <thead>
                       <tr>
                           <th>TESTAR</th>
                       </tr>
                   </thead>
                   <tbody>
                       <xsl:for-each select="/minxml/lista/rad">
                           <xsl:variable name="minvariabel">
                               <xsl:choose>
                                   <xsl:when test="position() mod 2">
                                       <xsl:value-of select="'white'"/>
                                   </xsl:when>
                                   <xsl:otherwise>
                                       <xsl:value-of select="'grey'"/>
                                   </xsl:otherwise>
                               </xsl:choose>
                           </xsl:variable>
                           <tr style="background-color:{$minvariabel}">
                               <td>
                                   <xsl:value-of select="."/>
                               </td>
                           </tr>
                       </xsl:for-each>
                   </tbody>
               </table>
           </body>
       </html>
   </xsl:template>
</xsl:stylesheet>

 

Resultat

<html xmlns:fo="http://www.w3.org/1999/XSL/Format">
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-16">
<title></title>
</head>
<body>
<table>
<thead>
<tr>
<th>TESTAR</th>
</tr>
</thead>
<tbody>
<tr style="background-color:white">
<td>Rad ett</td>
</tr>
<tr style="background-color:grey">
<td>Rad två</td>
</tr>
<tr style="background-color:white">
<td>Rad tre</td>
</tr>
</tbody>
</table>
</body>
</html>

 

Länk till kommentar
Dela på andra webbplatser

Jonny Bergdahl

Då ska du titta närmare på XPath-funktioner, exempelvis på http://www.w3schools.com/xpath/xpath_functions.asp. Notera bara att inte alla XPath-funktioner är tillgängliga från en XSL-mall.

 

För att besvara din specifika fråga, så kan du testa med position(), den räknar upp en för varje träff i for-each-satsen.

 

<xsl:if test="position() mod 2 = 0">
 <xsl:text>Jämn rad</xsl:text>
</xsl:if>
<xsl:if test="position() mod 2 != 0">
 <xsl:text>Udda rad</xsl:text>
</xsl:if>

 

Mvh;

/jb

 

Länk till kommentar
Dela på andra webbplatser

Lindacharlotta

Fick ihop det.. :-)

 

Tack för hjälpen!

 

/ Linda

[inlägget ändrat 2008-11-28 13:03:33 av Lindacharlotta]

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...