Integrera W3C Validation Service i dina projekt

När man tillhandahåller ett CMS-system åt en kund så är det nästan oundvikligt att kunderna kommer att skriva in ogiltig XHTML. Alla kan helt enkelt inte vara webbstandard-freaks och det är inget man kan kräva av någon.

Då skulle det vara perfekt om man kunde få en varning så fort ogiltig kod har publiserats, så man kan gå in och rätta till den.

Blitz Labs har gjort en sådan lösning och delar med sig av .NET-koden. Funktionen tar emot en url som ska kontrolleras. Skickar ett anrop till W3C Markup Validation Service. Tar emot resultatet genom deras SOAP-tjänst och transformerar det till RSS med hjälp av en XSLT-fil.

Prenumenera sedan på den RSS som skapats och få meddelande så fort någon ogiltig kod har publiserats.

By Jesper Lind

XSLT med XMLDataSource kontrollen (och GeoNames)

Höll på att testa lite med att koppla en XMLDataSource till en DropDownList och stötte på lite problem. Jag fick följande felmeddelande:

System.Web.UI.WebControls.XmlDataSourceNodeDescriptor innehåller inte någon egenskap med namnet name.

Efter lite sökning på nätet kom jag underfund med att det inte går att ange DataTextField till ett fält-värde i xml-filen. Det ska vara attribut till en tagg för att det ska fungera. Här är ett exempel på den xml fil som jag testade med som för övrigt är genererad av an tjänst på www.geonames.org och visar "first-order administrative division" Sverige. Jag ville få fram alla län men tror inte detta var helt rätt. Resten av parametrarna som man kan skicka med finns på en lista, här.

<geonames>
<totalResultsCount>85543</totalResultsCount>

<geoname>
<name>Stockholm</name>
<lat>59.3294681359869</lat>
<lng>18.0626392364502</lng>
<geonameId>2673730</geonameId>
<countryCode>SE</countryCode>
<countryName>Sweden</countryName>
<fcl>P</fcl>
<fcode>PPLC</fcode>
</geoname>

<geoname>
<name>Gothenburg</name>
<lat>57.7166667</lat>
<lng>11.9666667</lng>
<geonameId>2711537</geonameId>
<countryCode>SE</countryCode>
<countryName>Sweden</countryName>
<fcl>P</fcl>
<fcode>PPLA</fcode>
</geoname>

<geoname>
<name>Uppsala</name>
<lat>59.85</lat>
<lng>17.6333333</lng>
<geonameId>2666199</geonameId>
<countryCode>SE</countryCode>
<countryName>Sweden</countryName>
<fcl>P</fcl>
<fcode>PPLA</fcode>
</geoname>
...
</geonames>

Jag hittade lösningen som jag använder på Raj Kaimal's blogg. För att transformera xml-filen ovan så att name blir ett attribut till geoname kan man använda en XSLT-fil (TransformGeonames.xsl) som ser ut så här.

<?xml version="1.0" encoding="utf-8"?>

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

<xsl:template match="geonames">
<geonames>
<xsl:apply-templates select="geoname"/>
</geonames>
</xsl:template>
<xsl:template match="geoname">
<geoname>
<xsl:attribute name="name">
<xsl:value-of select="name"/>
</xsl:attribute>
</geoname>
</xsl:template>

</xsl:stylesheet>

Slutligen visar jag den koden som konsumerar web-servicen med XSLT-transformeringen.

<%@ Page Language="C#" AutoEventWireup="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>XmlDataSource with XSLT</title>
</head>
<body>
<form id="form1" runat="server">
<asp:dropdownlist ID="Dropdownlist1" DataSourceID="XmlDataSource1" DataTextField="name" runat="server"></asp:dropdownlist>
<asp:XmlDataSource ID="XmlDataSource1" DataFile="http://ws.geonames.org/search?q=sverige&country=SE&fclass=ADM1" TransformFile="TransformGeonames.xsl" XPath="geonames/geoname" runat="server"></asp:XmlDataSource>
</form>
</body>
</html>

By Jesper Lind
1