{"id":8,"date":"2008-03-05T17:33:35","date_gmt":"2008-03-05T16:33:35","guid":{"rendered":"http:\/\/wordpress.hinnerup.net\/2008\/03\/05\/xslt_msxsl_script\/"},"modified":"2009-09-30T21:56:41","modified_gmt":"2009-09-30T20:56:41","slug":"xslt_msxsl_script","status":"publish","type":"post","link":"https:\/\/www.hinnerup.net\/en\/permanent\/2008\/03\/05\/xslt_msxsl_script\/","title":{"rendered":"XSLT konvertering til store\/sm\u00e5 bogstaver"},"content":{"rendered":"<p>Den almene metode til at konvertere strenge til f.eks. sm\u00e5 bogstaver (minuskler) for at udf\u00f8re en sammenligning, eller blot for at pr\u00e6sentere det transformerede resultat p\u00e5 den vis, er at benytte sig af <a href=\"http:\/\/da.wikipedia.org\/wiki\/XPath\">XPath<\/a> funktionen <a href=\"http:\/\/www.w3schools.com\/xpath\/xpath_functions.asp\"><tt>translate<\/tt><\/a>. Flere steder finder man <a href=\"http:\/\/www.topxml.com\/xsl\/articles\/caseconvert\/\">netop denne l\u00f8sning implementeret<\/a>\u00a0og den fremf\u00f8res ofte\u00a0som en god m\u00e5de at konvertere strenge til f.eks. minuskler, blandt andet i <a href=\"http:\/\/www.amazon.com\/XSLT-Programmers-Reference-2nd-Michael\/dp\/1861005067\">XSLT 2nd Edition Programmer&#8217;s Reference<\/a> af Michael Kay, der m\u00e5 siges at v\u00e6re &#8220;biblen&#8221; indenfor <a href=\"http:\/\/da.wikipedia.org\/wiki\/XSLT\">XSLT<\/a>-omr\u00e5det.<\/p>\n<p>En XSLT transformationsfil der skal kunne foretage konvertering af danske strenge vil typisk indeholde:<\/p>\n<pre>\r\n&lt;!-- translate strenge --&gt;\r\n&lt;xsl:variable name=\"lcletters\"&gt;abcdefghijklmnopqrstuvwxyz\u00e6\u00f8\u00e5&lt;\/xsl:variable&gt;\r\n&lt;xsl:variable name=\"ucletters\"&gt;ABCDEFGHIJKLMNOPQRSTUVWXYZ\u00c6\u00d8\u00c5&lt;\/xsl:variable&gt;\r\n...\r\n&lt;!-- til versaler --&gt;\r\n&lt;xsl:value-of select=\"translate($toconvert,$lcletters,$ucletters)\"\/&gt;\r\n...\r\n&lt;!-- til minuskler --&gt;\r\n&lt;xsl:value-of select=\"translate($toconvert,$ucletters,$lcletters)\"\/&gt;<\/pre>\n<p>Problemet med <tt>translate<\/tt>-l\u00f8sningen er, at den ikke tager h\u00f8jde for andre tegn end dem man eksplicit angiver &#8211; og det kan v\u00e6re en stor opgave hvis tegns\u00e6ttet der anvendes er <a href=\"http:\/\/da.wikipedia.org\/wiki\/UTF-8\">UTF-8<\/a> eller blot <a href=\"http:\/\/da.wikipedia.org\/wiki\/ISO_8859-1\">ISO-Latin-1<\/a>. Der er henholdsvist flere tusinde \/\u00a0hundrede tegn i disse tegns\u00e6t. Tegn der ikke er angivet slipper u\u00e6ndrede igennem transformationen med <tt>translate<\/tt>.<\/p>\n<p>Med nedenst\u00e5ende <a href=\"http:\/\/da.wikipedia.org\/wiki\/XML\">XML<\/a>-datafil i h\u00e5nden vil f\u00f8rn\u00e6vnte <tt>translate<\/tt>-strenge fejle, da &#8220;umlaut&#8221;-tegnene ikke er d\u00e6kkede.<\/p>\n<pre>\r\n&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n&lt;items&gt;\r\n  &lt;item&gt;\r\n    &lt;title&gt;Dette er danske tegn \u00e6\u00f8\u00e5\u00c6\u00d8\u00c5&lt;\/title&gt;\r\n  &lt;\/item&gt;\r\n  &lt;item&gt;\r\n    &lt;title&gt;Dette er andre tegn \u00fc\u00f6\u00e4\u00dc\u00d6\u00c4&lt;\/title&gt;\r\n  &lt;\/item&gt;\r\n&lt;\/items&gt;<\/pre>\n<p>En anden metode jeg derfor har n\u00f8rklet med i dag, der dog kun fungerer i Internet Explorer, er at indlejre et <a href=\"http:\/\/da.wikipedia.org\/wiki\/JavaScript\">JavaScript<\/a> i XSLT transformationsfilen, og herfra udnytte JavaScript&#8217;s <a href=\"http:\/\/www.w3schools.com\/jsref\/jsref_toLowerCase.asp\"><tt>toLowerCase()<\/tt> funktion<\/a>. Firefox har endnu ikke underst\u00f8ttelse for <a href=\"http:\/\/www.w3.org\/TR\/xslt11\/\">XSLT 1.1 &lt;xsl:script&gt;<\/a>, hvorimod Internet Explorer tilbyder en Microsoft-propriet\u00e6r implementation der fungerer ganske udem\u00e6rket, nemlig <a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/ms256042.aspx\"><tt>&lt;msxsl:script&gt;<\/tt><\/a>.<\/p>\n<pre>\r\n&lt;?xml version=\"1.0\" encoding=\"ISO-8859-1\"?&gt;\r\n&lt;xsl:stylesheet version=\"1.0\"\r\nxmlns:xsl=\"http:\/\/www.w3.org\/1999\/XSL\/Transform\"\r\nxmlns:msxsl=\"urn:schemas-microsoft-com:xslt\"\r\nxmlns:tns=\"urn:thisnamespace:tns\"\r\nexclude-result-prefixes=\"tns msxsl\"&gt;\r\n&lt;msxsl:script language=\"JavaScript\" implements-prefix=\"tns\"&gt;\r\nfunction lCase(item) {\r\n  return (''+item).toLowerCase(); \r\n}\r\n&lt;\/msxsl:script&gt;\r\n&lt;xsl:template match=\"\/\"&gt;\r\n  &lt;xsl:for-each select=\"items\/item\"&gt;\r\n    &lt;xsl:variable name=\"aparam\" select=\"title\"\/&gt;\r\n    &lt;xsl:value-of select=\"tns:lCase(string($aparam))\"\/&gt;&lt;br \/&gt;\r\n  &lt;\/xsl:for-each&gt;\r\n&lt;\/xsl:template&gt;\r\n&lt;\/xsl:stylesheet&gt;<\/pre>\n<p>Du kan ved brug af, Internet Explorer (version 6 eller nyere), se resultatet af at udf\u00f8re <a href=\"http:\/\/michael.hinnerup.net\/2008\/03\/eksperimenter\/msxsl-script\/\">XSL + JavaScript transformationen her<\/a>. Det forventede resultat er at samtlige tegn i XML-datafilen er konverteret til minuskler.<\/p>\n<p>Jeg leder fortsat efter en elegant cross-browser l\u00f8sning, men for nuv\u00e6rende er ovenst\u00e5ende d\u00e6kkende pga. krav til opgaven specifikt kun er rettet imod slutbrugere der anvender Internet Explorer.<\/p>","protected":false},"excerpt":{"rendered":"<p>Den almene metode til at konvertere strenge til f.eks. sm\u00e5 bogstaver (minuskler) for at udf\u00f8re en sammenligning, eller blot for at pr\u00e6sentere det transformerede resultat p\u00e5 den vis, er at benytte sig af XPath funktionen translate. Flere steder finder man netop denne l\u00f8sning implementeret\u00a0og den fremf\u00f8res ofte\u00a0som en god m\u00e5de at konvertere strenge til f.eks. [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-8","post","type-post","status-publish","format-standard","hentry","category-xslt"],"_links":{"self":[{"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/posts\/8","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/comments?post=8"}],"version-history":[{"count":1,"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/posts\/8\/revisions"}],"predecessor-version":[{"id":566,"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/posts\/8\/revisions\/566"}],"wp:attachment":[{"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/media?parent=8"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/categories?post=8"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hinnerup.net\/en\/wp-json\/wp\/v2\/tags?post=8"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}