<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8900077986546582424</id><updated>2012-01-24T04:27:19.487Z</updated><category term='Addin'/><category term='XSD'/><category term='XQSharp'/><category term='xml editor virtual formatting'/><category term='Schematron XSLT Saxon CoherentWeb'/><category term='Chinese'/><category term='XML'/><category term='2007'/><category term='SketchPath'/><category term='Word'/><category term='getting started'/><category term='Large'/><category term='Word 2007'/><category term='XSLT 2.0'/><category term='XQuery'/><category term='File'/><category term='Linq'/><category term='XSLT IDE'/><category term='xpath'/><category term='XPath XSLT Parser'/><category term='Book'/><category term='parser'/><category term='XML Prague 2009'/><category term='cdata'/><category term='WPF'/><category term='Saxon'/><title type='text'>Things XML</title><subtitle type='html'>Researching XML-based solutions</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>57</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-8842755859467144970</id><published>2012-01-07T11:14:00.004Z</published><updated>2012-01-07T18:19:18.367Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='XPath XSLT Parser'/><title type='text'>Colorising XPaths</title><content type='html'>I've been working on &lt;a href="http://www.saxonica.com/ce/doc/contents.html"&gt;Saxon-CE&lt;/a&gt;, a browser-based XSLT 2.0 processor, with the Saxonica team for a few months now. The main programming languages I've used JavaScript and GWT Java, with XSLT just being used for small well-defined test-cases.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Over the holidays I decided to whet my appetite to do more with client-side XSLT by developing a small Web App. I've started things off with an &lt;a href="http://qutoric.com/xslt/analyser/xpathtool.html"&gt;XPath Analyser,&amp;nbsp;&lt;/a&gt;a simple app, but one that can be developed to be a more sophisticated XPath Tool in a number of separate stages.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Even with a small app it helps to write a tool that accomplishes something vaguely useful, so XPath Analyser lets you enter any XPath Expression (1.0 or 2.0) and colorises it when you press &lt;run&gt;. If I want to include an XPath Expression in my blog (using Bloggers Rich Editor), instead of including something like:&lt;/run&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #ececec; color: #3d5b96; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 9pt; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;if (count($splitToken) ne 2)&lt;/div&gt;&lt;div style="background-color: #ececec; color: #3d5b96; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 9pt; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;then dxt:main[attribute::place + 1.34e-27 = 28] (: Edit XPath and Refresh :)&lt;/div&gt;&lt;div style="background-color: #ececec; color: #3d5b96; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 9pt; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;else if ($splitToken[1] eq 'instance' and $splitToken[2] eq 'of') (:to review expressions (: castable as :) :)&lt;/div&gt;&lt;div style="background-color: #ececec; color: #3d5b96; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 9pt; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;then (count($pxt:pcz) ge 2200 or pxt:dema/pxt:semi[@test])&lt;/div&gt;&lt;div style="background-color: #ececec; color: #3d5b96; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 9pt; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;else if ($splitToken[1] = ('cast','castable','treat','(:literal:)') and $splitToken[2] eq 'as')&lt;/div&gt;&lt;div style="background-color: #ececec; color: #3d5b96; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 9pt; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;then true() else some $pxa in tree/branches satisfies $pxa &amp;gt; 22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I can make it prettier, by pressing &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;i&gt;Run&lt;/i&gt;&lt;/span&gt;&amp;nbsp;&lt;run&gt;and then copying and pasting from the tool, I then get this:&lt;/run&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #ececec; color: #3d5b96; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 9pt; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;&lt;span class="if" id="s1" style="color: hotpink;"&gt;if&lt;/span&gt;&lt;span class="whitespace" id="s3"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="parenthesis" id="s4"&gt;(&lt;/span&gt;&lt;span class="function" id="s5" style="color: lightseagreen;"&gt;count(&lt;/span&gt;&lt;span class="variable" id="s11" style="color: orange;"&gt;$splitToken&lt;/span&gt;&lt;span class="parenthesis" id="s22"&gt;)&lt;/span&gt;&lt;span class="whitespace" id="s23"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="op" id="s24" style="color: blue;"&gt;ne&lt;/span&gt;&lt;span class="whitespace" id="s26"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="numeric" id="s27" style="color: black;"&gt;2&lt;/span&gt;&lt;span class="parenthesis" id="s28"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: #ececec; color: #3d5b96; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 9pt; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;&lt;span class="whitespace"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="op" id="s33" style="color: blue;"&gt;then&lt;/span&gt;&lt;span class="whitespace" id="s37"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="normal" id="s38" style="color: saddlebrown;"&gt;dxt:main&lt;/span&gt;&lt;span class="filter" id="s46"&gt;[&lt;/span&gt;&lt;span class="axis" id="s47" style="color: mediumslateblue;"&gt;attribute::&lt;/span&gt;&lt;span class="normal" id="s58" style="color: saddlebrown;"&gt;place&lt;/span&gt;&lt;span class="whitespace" id="s63"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="op" id="s64" style="color: blue;"&gt;+&lt;/span&gt;&lt;span class="whitespace" id="s65"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="numeric" id="s66" style="color: black;"&gt;1.34e-27&lt;/span&gt;&lt;span class="whitespace" id="s74"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="op" id="s75" style="color: blue;"&gt;=&lt;/span&gt;&lt;span class="whitespace" id="s76"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="numeric" id="s77" style="color: black;"&gt;28&lt;/span&gt;&lt;span class="filter" id="s79"&gt;]&lt;/span&gt;&lt;span class="whitespace" id="s80"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="comment" id="s81" style="color: green;"&gt;(: Edit XPath and Refresh :)&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: #ececec; color: #3d5b96; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 9pt; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;&lt;span class="whitespace"&gt;&lt;/span&gt;&lt;span class="op" id="s110" style="color: blue;"&gt;else&lt;/span&gt;&lt;span class="whitespace" id="s114"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="if" id="s115" style="color: hotpink;"&gt;if&lt;/span&gt;&lt;span class="whitespace" id="s117"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="parenthesis" id="s118"&gt;(&lt;/span&gt;&lt;span class="variable" id="s119" style="color: orange;"&gt;$splitToken&lt;/span&gt;&lt;span class="filter" id="s130"&gt;[&lt;/span&gt;&lt;span class="numeric" id="s131" style="color: black;"&gt;1&lt;/span&gt;&lt;span class="filter" id="s132"&gt;]&lt;/span&gt;&lt;span class="whitespace" id="s133"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="op" id="s134" style="color: blue;"&gt;eq&lt;/span&gt;&lt;span class="whitespace" id="s136"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="literal" id="s137" style="color: grey;"&gt;'instance'&lt;/span&gt;&lt;span class="whitespace" id="s147"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="op" id="s148" style="color: blue;"&gt;and&lt;/span&gt;&lt;span class="whitespace" id="s151"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="variable" id="s152" style="color: orange;"&gt;$splitToken&lt;/span&gt;&lt;span class="filter" id="s163"&gt;[&lt;/span&gt;&lt;span class="numeric" id="s164" style="color: black;"&gt;2&lt;/span&gt;&lt;span class="filter" id="s165"&gt;]&lt;/span&gt;&lt;span class="whitespace" id="s166"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="op" id="s167" style="color: blue;"&gt;eq&lt;/span&gt;&lt;span class="whitespace" id="s169"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="literal" id="s170" style="color: grey;"&gt;'of'&lt;/span&gt;&lt;span class="parenthesis" id="s174"&gt;)&lt;/span&gt;&lt;span class="whitespace" id="s175"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="comment" id="s176" style="color: green;"&gt;(:to review expressions (: castable as :) :)&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: #ececec; color: #3d5b96; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 9pt; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;&lt;span class="whitespace"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="op" id="s224" style="color: blue;"&gt;then&lt;/span&gt;&lt;span class="whitespace" id="s228"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="parenthesis" id="s229"&gt;(&lt;/span&gt;&lt;span class="function" id="s230" style="color: lightseagreen;"&gt;count(&lt;/span&gt;&lt;span class="variable" id="s236" style="color: orange;"&gt;$pxt:pcz&lt;/span&gt;&lt;span class="parenthesis" id="s244"&gt;)&lt;/span&gt;&lt;span class="whitespace" id="s245"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="op" id="s246" style="color: blue;"&gt;ge&lt;/span&gt;&lt;span class="whitespace" id="s248"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="numeric" id="s249" style="color: black;"&gt;2200&lt;/span&gt;&lt;span class="whitespace" id="s253"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="op" id="s254" style="color: blue;"&gt;or&lt;/span&gt;&lt;span class="whitespace" id="s256"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="normal" id="s257" style="color: saddlebrown;"&gt;pxt:dema&lt;/span&gt;&lt;span class="op" id="s265" style="color: blue;"&gt;/&lt;/span&gt;&lt;span class="normal" id="s266" style="color: saddlebrown;"&gt;pxt:semi&lt;/span&gt;&lt;span class="filter" id="s274"&gt;[&lt;/span&gt;&lt;span class="axis" id="s275" style="color: mediumslateblue;"&gt;@&lt;/span&gt;&lt;span class="normal" id="s276" style="color: saddlebrown;"&gt;test&lt;/span&gt;&lt;span class="filter" id="s280"&gt;]&lt;/span&gt;&lt;span class="parenthesis" id="s281"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: #ececec; color: #3d5b96; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 9pt; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;&lt;span class="whitespace"&gt;&lt;/span&gt;&lt;span class="op" id="s283" style="color: blue;"&gt;else&lt;/span&gt;&lt;span class="whitespace" id="s287"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="if" id="s288" style="color: hotpink;"&gt;if&lt;/span&gt;&lt;span class="whitespace" id="s290"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="parenthesis" id="s291"&gt;(&lt;/span&gt;&lt;span class="variable" id="s292" style="color: orange;"&gt;$splitToken&lt;/span&gt;&lt;span class="filter" id="s303"&gt;[&lt;/span&gt;&lt;span class="numeric" id="s304" style="color: black;"&gt;1&lt;/span&gt;&lt;span class="filter" id="s305"&gt;]&lt;/span&gt;&lt;span class="whitespace" id="s306"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="op" id="s307" style="color: blue;"&gt;=&lt;/span&gt;&lt;span class="whitespace" id="s308"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="parenthesis" id="s309"&gt;(&lt;/span&gt;&lt;span class="literal" id="s310" style="color: grey;"&gt;'cast'&lt;/span&gt;&lt;span class="op" id="s316" style="color: blue;"&gt;,&lt;/span&gt;&lt;span class="literal" id="s317" style="color: grey;"&gt;'castable'&lt;/span&gt;&lt;span class="op" id="s327" style="color: blue;"&gt;,&lt;/span&gt;&lt;span class="literal" id="s328" style="color: grey;"&gt;'treat'&lt;/span&gt;&lt;span class="op" id="s335" style="color: blue;"&gt;,&lt;/span&gt;&lt;span class="literal" id="s336" style="color: grey;"&gt;'(:literal:)'&lt;/span&gt;&lt;span class="parenthesis" id="s349"&gt;)&lt;/span&gt;&lt;span class="whitespace" id="s350"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="op" id="s351" style="color: blue;"&gt;and&lt;/span&gt;&lt;span class="whitespace" id="s354"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="variable" id="s355" style="color: orange;"&gt;$splitToken&lt;/span&gt;&lt;span class="filter" id="s366"&gt;[&lt;/span&gt;&lt;span class="numeric" id="s367" style="color: black;"&gt;2&lt;/span&gt;&lt;span class="filter" id="s368"&gt;]&lt;/span&gt;&lt;span class="whitespace" id="s369"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="op" id="s370" style="color: blue;"&gt;eq&lt;/span&gt;&lt;span class="whitespace" id="s372"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="literal" id="s373" style="color: grey;"&gt;'as'&lt;/span&gt;&lt;span class="parenthesis" id="s377"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: #ececec; color: #3d5b96; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 9pt; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;&lt;span class="whitespace"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="op" id="s382" style="color: blue;"&gt;then&lt;/span&gt;&lt;span class="whitespace" id="s386"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="function" id="s387" style="color: lightseagreen;"&gt;true(&lt;/span&gt;&lt;span class="parenthesis" id="s392"&gt;)&lt;/span&gt;&lt;span class="whitespace" id="s393"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="op" id="s394" style="color: blue;"&gt;else&lt;/span&gt;&lt;span class="whitespace" id="s398"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="higher" id="s399" style="color: red;"&gt;some&lt;/span&gt;&lt;span class="whitespace" id="s403"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="variable" id="s404" style="color: orange;"&gt;$pxa&lt;/span&gt;&lt;span class="whitespace" id="s408"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="op" id="s409" style="color: blue;"&gt;in&lt;/span&gt;&lt;span class="whitespace" id="s411"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="normal" id="s412" style="color: saddlebrown;"&gt;tree&lt;/span&gt;&lt;span class="op" id="s416" style="color: blue;"&gt;/&lt;/span&gt;&lt;span class="normal" id="s417" style="color: saddlebrown;"&gt;branches&lt;/span&gt;&lt;span class="whitespace" id="s425"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="op" id="s426" style="color: blue;"&gt;satisfies&lt;/span&gt;&lt;span class="whitespace" id="s435"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="variable" id="s436" style="color: orange;"&gt;$pxa&lt;/span&gt;&lt;span class="whitespace" id="s440"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="op" id="s441" style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span class="whitespace" id="s442"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="numeric" id="s443" style="color: black;"&gt;22&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Much better, and just 500 or so lines of XSLT! One of the benefits of writing a lexer/parser with XSLT is that the declarative nature of the language helps enforce a certain-level of design discipline, especially helpful with XPath as there are some quite complex syntax rules.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, this isn't a true XPath Parser, such as &lt;a href="http://dnovatchev.wordpress.com/"&gt;Dimitre Novatchev's&lt;/a&gt;, but it does provides enough structure for colorising and will help with the next stage which is to dynamically generate selected parts as sub-expressions, by prepending the context path:&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #ececec; color: #3d5b96; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 9pt; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;&lt;span class="whitespace" id="s1"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="variable" id="s2" style="color: orange;"&gt;$a&lt;/span&gt;&lt;span class="filter" id="s4"&gt;[&lt;/span&gt;&lt;span class="function" id="s5" style="color: lightseagreen;"&gt;position(&lt;/span&gt;&lt;span class="parenthesis" id="s14"&gt;)&lt;/span&gt;&lt;span class="whitespace" id="s15"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="op" id="s16" style="color: blue;"&gt;lt&lt;/span&gt;&lt;span class="whitespace" id="s18"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="variable" id="s19" style="color: orange;"&gt;$c&lt;/span&gt;&lt;span class="filter" id="s21"&gt;]&lt;/span&gt;&lt;span class="filter" id="s22"&gt;[&lt;/span&gt;&lt;span class="function" id="s23" style="color: lightseagreen;"&gt;position(&lt;/span&gt;&lt;span class="parenthesis" id="s32"&gt;)&lt;/span&gt;&lt;span class="whitespace" id="s33"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="op" id="s34" style="color: blue;"&gt;gt&lt;/span&gt;&lt;span class="whitespace" id="s36"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="function" id="s37" style="color: lightseagreen;"&gt;sum(&lt;/span&gt;&lt;span class="numeric" id="s41" style="color: black;"&gt;25&lt;/span&gt;&lt;span class="whitespace" id="s43"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="op" id="s44" style="color: blue;"&gt;+&lt;/span&gt;&lt;span class="whitespace" id="s45"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="axis" id="s46" style="color: mediumslateblue;"&gt;@&lt;/span&gt;&lt;span class="normal" id="s47" style="color: saddlebrown;"&gt;books&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: #ececec; color: #3d5b96; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 9pt; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;&lt;span class="normal" style="color: saddlebrown;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: #ececec; color: #3d5b96; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 9pt; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;&lt;span class="whitespace"&gt;&lt;/span&gt;&lt;span class="comment" id="s55" style="color: green;"&gt;when @books is selected, output is&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: #ececec; color: #3d5b96; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 9pt; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;&lt;span class="comment" style="color: green;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: #ececec; color: #3d5b96; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 9pt; line-height: 1.3em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;&lt;span class="whitespace"&gt;&lt;/span&gt;&lt;span class="variable" id="s101" style="color: orange;"&gt;$a&lt;/span&gt;&lt;span class="filter" id="s103"&gt;[&lt;/span&gt;&lt;span class="function" id="s104" style="color: lightseagreen;"&gt;position(&lt;/span&gt;&lt;span class="parenthesis" id="s113"&gt;)&lt;/span&gt;&lt;span class="whitespace" id="s114"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="op" id="s115" style="color: blue;"&gt;lt&lt;/span&gt;&lt;span class="whitespace" id="s117"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="variable" id="s118" style="color: orange;"&gt;$c&lt;/span&gt;&lt;span class="filter" id="s120"&gt;]&lt;/span&gt;&lt;span class="op" id="s121" style="color: blue;"&gt;/&lt;/span&gt;&lt;span class="axis" id="s122" style="color: mediumslateblue;"&gt;@&lt;/span&gt;&lt;span class="normal" id="s123" style="color: saddlebrown;"&gt;books&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-8842755859467144970?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/8842755859467144970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2012/01/colorising-xpaths.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/8842755859467144970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/8842755859467144970'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2012/01/colorising-xpaths.html' title='Colorising XPaths'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-590760847534621976</id><published>2011-09-21T09:37:00.004+01:00</published><updated>2011-09-22T08:12:41.474+01:00</updated><title type='text'>Please help with this XMLQuire Poll:</title><content type='html'>To recap on virtual formatting, in case you haven't yet tried &lt;a href="http://xmlquire.com/"&gt;XMLQuire&lt;/a&gt; or seen this video:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://0.gvt0.com/vi/IFJHG1EnS0A/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/IFJHG1EnS0A&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/IFJHG1EnS0A&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://twtpoll.com/js/badge.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script src="http://twtpoll.com/badge/?twt=l1drla&amp;amp;b=1&amp;amp;bt=1" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Many thanks, you should see the running tally as you vote. I will post back a summary in 3 days, when the poll closes.&lt;br /&gt;&lt;br /&gt;Phil&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-590760847534621976?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/590760847534621976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2011/09/please-help-with-this-xmlquire-poll.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/590760847534621976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/590760847534621976'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2011/09/please-help-with-this-xmlquire-poll.html' title='Please help with this XMLQuire Poll:'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-7631990263041880265</id><published>2011-09-20T19:05:00.000+01:00</published><updated>2011-09-20T19:05:19.199+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XSLT IDE'/><title type='text'>Rise and Fall: Writing an XSLT Editor - Part 4</title><content type='html'>CoherentWeb, the XSLT-based Integrated Batch-Processing Environment (IBPE) is now no longer being marketed, though it will continue in private development in the hope of resurrecting it some time in future. This was not a difficult decision:&lt;br /&gt;&lt;br /&gt;Though this product was carefully placed to complement conventional IDEs rather than compete with them, it seems clear that the market-strength of the major IDEs make the IBPE concept non-viable as a commerical proposition, at least for a microISV startup.&lt;br /&gt;&lt;br /&gt;I still believe earnestly that something is needed to fill the gap between the editing focussed IDEs and the processing focussed back-end systems. Few developers can realistically develop XSLT against a single XML instance and yet this is the way IDEs present the environment, one input, one output. Sure, they let you batch-process a folder but how many of them have these features?&lt;br /&gt;&lt;br /&gt;Multi-threaded batch-processing&lt;br /&gt;Seamless presentation of output alongside each each input&lt;br /&gt;Summary reports of all outputs&lt;br /&gt;Real-Time update of batch progress&lt;br /&gt;Instant cancellation of a batch-job&lt;br /&gt;Background clearing of previous batch-jobs&lt;br /&gt;Single-Click reviewing&lt;br /&gt;Management of linked resources such as graphics&lt;br /&gt;Zip-Package creation&lt;br /&gt;&lt;br /&gt;The answer is of course none of them. This doesn't make XSLT IDEs bad tools of course (far from it), it simply means that something else is required, something that can cope with a few dozen or a few hundred inputs and manage all the associated resource files.&lt;br /&gt;&lt;br /&gt;So, along with the demise of CoherentWeb, the XSLT editor integrated into this tool is also very likely doomed. This introduced a range of features new to XSLT. Most popular of course was virtual formatting (mentioned in several other blogs), which would almost eliminate the need for xsl:text elements, if only other XSLT editors were to adopt this.&lt;br /&gt;&lt;br /&gt;But there were many other new features also: the XPath manager with full predicate-by-predicate tracing, the literal result elements validation of static XSLT, the schema-scanner for schema-set based validation. I hope at least some of these features appear soon in the current (and otherwise excellent) crop of XSLT editors available. So even if CoherentWeb is dead, some ideas from it may live on.&lt;br /&gt;&lt;br /&gt;There are some promising signs in the XSLT IDE sector, some products appear to be shedding their more peripheral XML authoring features, to provide a more focussed UI for the developer, this has got to be a good thing. This should give us simpler toolbars and less distraction from features we don't need, hopefully more will follow.&lt;br /&gt;&lt;br /&gt;One last screenshot of CoherentWeb for the sake of nostalgia:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-zSV_6vgNtyo/TnjVKh9kZFI/AAAAAAAAAFY/_vB6Sz0AQgI/s1600/cover.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-zSV_6vgNtyo/TnjVKh9kZFI/AAAAAAAAAFY/_vB6Sz0AQgI/s1600/cover.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-7631990263041880265?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/7631990263041880265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2011/09/rise-and-fall-writing-xslt-editor-part.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/7631990263041880265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/7631990263041880265'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2011/09/rise-and-fall-writing-xslt-editor-part.html' title='Rise and Fall: Writing an XSLT Editor - Part 4'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-zSV_6vgNtyo/TnjVKh9kZFI/AAAAAAAAAFY/_vB6Sz0AQgI/s72-c/cover.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-4708585620383185162</id><published>2011-09-17T16:48:00.000+01:00</published><updated>2011-09-17T16:48:26.291+01:00</updated><title type='text'>Abstract Syntax Trees: Writing an XSLT Editor - Part 3</title><content type='html'>In the previous part to this series, I mentioned a 'frozen string' approach in the context of keeping an internal model of parsed the XML text, I now prefer using the term 'Abstract Syntax Tree' - though I'm not certain whether it strictly fits the &lt;a href="http://en.wikipedia.org/wiki/Abstract_syntax_tree"&gt;WIKI defiintion&lt;/a&gt; or that used on the &lt;a href="http://www.jetbrains.com/mps/"&gt;JetBrains MPS&lt;/a&gt; web page.&lt;br /&gt;&lt;br /&gt;In CoherentWeb, the 'XML model' is maintained as a simple collection of 'Node Descriptor Groups' (NDG), with 1 NDG for each node, except attribute and text nodes as these don't contribute towards the XML hierarchy. Each CDATA section has its own NDG, and perhaps surprisingly, even all the 'XML' nodes within comments have one.&lt;br /&gt;&lt;br /&gt;NDGs are slightly different depending on whether they represent element nodes or comment nodes for example, but to take an element node - you might have the following:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-2rG-nDf6lgc/TnS6MCYTAOI/AAAAAAAAAFM/jmJ7vEmoWC8/s1600/nodes-descriptor.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-2rG-nDf6lgc/TnS6MCYTAOI/AAAAAAAAAFM/jmJ7vEmoWC8/s1600/nodes-descriptor.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The above should be fairly self-explanatory, Start and End are the character positions of the node within the XML text. NodePointer is the count of how many preceding sibling nodes there are in the tree, this, combined with the &lt;i&gt;ParentIndex&lt;/i&gt; and &lt;i&gt;Level&lt;/i&gt; identify the exact postition of the NDG within the AST. This data is managed for each node and the whole collection makes up the Abstract Syntax Tree (AST).&lt;br /&gt;&lt;br /&gt;The AST is used for a whole range of tasks including:&lt;br /&gt;Knowing the context of the current selection&lt;br /&gt;Building a lazy-loading element tree from the currently selected node&lt;br /&gt;Showing the selected XPath location, complete with qualifying predicates&lt;br /&gt;Displaying the currently selected element name&lt;br /&gt;Showing XPath, name and value of all nodes that have value within the current element&lt;br /&gt;Providing 'soft-edges' to tags and attributes to prevent accidental deletions&lt;br /&gt;Determining whether a key-press requires a partial reparse, a full reparse, or just an offset within the model&lt;br /&gt;&lt;br /&gt;The screenshot below shows the amount of information that needs to be displayed to the user when a node is selected, the AST is critical to doing this in a performant way:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-3_E0kPdeEXM/TnS8NJspitI/AAAAAAAAAFQ/ChmqQ4lD7uI/s1600/ndg.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-3_E0kPdeEXM/TnS8NJspitI/AAAAAAAAAFQ/ChmqQ4lD7uI/s1600/ndg.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;As well as the AST, syntax coloring of XML text is also exploited as this contains useful information about such things as whether an attribute name or attribute value is pressed, so it isn't necessary to replicate this in the model. Even quotation marks are a slightly different color (is this cheating?) so it can be determined whether they're opening or closing.&lt;br /&gt;&lt;br /&gt;All node data is stored in a generic &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;List&amp;lt;nodedescriptorgroup&amp;gt;.&amp;nbsp;&lt;/nodedescriptorgroup&gt;&lt;/span&gt;&lt;i&gt;NodeDescriptorGroup&lt;/i&gt; is a Class, it could have been a Struct, but then the AST would live on the stack instead of the heap - this could &amp;nbsp;then cause stackoverflow issues for very large XML documents.&lt;br /&gt;&lt;br /&gt;So, that's the Abstract Syntax Tree, an important part of an XML Editor design if you want to avoid excessive parsing of the XML text and provide user interface features where the exact selection context must be known.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-4708585620383185162?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/4708585620383185162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2011/09/abstract-syntax-trees-writing-xslt.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4708585620383185162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4708585620383185162'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2011/09/abstract-syntax-trees-writing-xslt.html' title='Abstract Syntax Trees: Writing an XSLT Editor - Part 3'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-2rG-nDf6lgc/TnS6MCYTAOI/AAAAAAAAAFM/jmJ7vEmoWC8/s72-c/nodes-descriptor.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-5899519100526925438</id><published>2011-09-15T17:27:00.000+01:00</published><updated>2011-09-15T17:27:34.338+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml editor virtual formatting'/><title type='text'>XML to music</title><content type='html'>Now for something a bit different.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is a video demo showing virtual formatting at work - parts of the video have been sped up to take account of my slow typing, all narration is in the form of the typed XML - there's some background music just for effect:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://0.gvt0.com/vi/IFJHG1EnS0A/0.jpg"&gt;&lt;param name="movie" value="http://www.youtube.com/v/IFJHG1EnS0A&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/IFJHG1EnS0A&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-5899519100526925438?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/5899519100526925438/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2011/09/xml-to-music.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/5899519100526925438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/5899519100526925438'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2011/09/xml-to-music.html' title='XML to music'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-1965410388413472988</id><published>2011-09-08T13:34:00.002+01:00</published><updated>2011-09-12T07:18:58.396+01:00</updated><title type='text'>XMLQuire Product Launch</title><content type='html'>Yesterday was the launch day for &lt;a href="http://xmlquire.com/"&gt;XMLQuire&lt;/a&gt;. This free and lightweight XML Editor uses CoherentWeb's 'Virtual Formatting' technology, but is without CoherentWeb's extensive XSLT/XPath features. Instead, XMLQuire makes a feature out of UX simplicity, light-weight and ease of deployment.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-qSRuvWKSWg4/Tmi1sKnskpI/AAAAAAAAAFI/17BMvVZ4wTU/s1600/xmlquire.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="161" src="http://1.bp.blogspot.com/-qSRuvWKSWg4/Tmi1sKnskpI/AAAAAAAAAFI/17BMvVZ4wTU/s320/xmlquire.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The hope is that XMLQuire will complement CoherentWeb in promoting the use of Virtual Formatting to a wider set of developers and XML authors in general. If more XML tools could only adopt this concept, then interoperability between tools would be greatly improved.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As things are, there are still comments coming in that show I'm not explaining very well what Virtual Formatting does, both for the XML editing user-experience, but more importantly, for the integrity of the XML itself. I think the problem lies in that we've grown so used to inserting characters for indentation that we &amp;nbsp;find it difficult to consider the problems indentation characters cause and what the alternatives are.&lt;br /&gt;&lt;br /&gt;Perhaps these two product can do their bit to spread the word - with the introduction of Virtual Formatting, it's no longer a question of 'tabs or spaces?' but 'indentation characters or ... nothing?'.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-1965410388413472988?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/1965410388413472988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2011/09/xmlquire-product-launch.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/1965410388413472988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/1965410388413472988'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2011/09/xmlquire-product-launch.html' title='XMLQuire Product Launch'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-qSRuvWKSWg4/Tmi1sKnskpI/AAAAAAAAAFI/17BMvVZ4wTU/s72-c/xmlquire.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-1708319238139388606</id><published>2011-08-23T15:25:00.001+01:00</published><updated>2011-08-23T15:26:36.629+01:00</updated><title type='text'>Editing Virtually Formatted XSLT</title><content type='html'>CoherentWeb's XSLT editor uses vitual formatting, where the XSLT is always properly indented, but without using tab or space characters. This absence of formatting characters allows us to write XSLT with much greater control of whitespace, without resorting to methods that affect the clarity and maintainability of the XSLT.&lt;br /&gt;&lt;br /&gt;In the screenshots posted here, all characters except line-feeds are highlighted in yellow, so the space characters are clearly visible. (To highlight elements in this way in the XSLT editor, I just selected the document element in the outline treeview).&lt;br /&gt;&lt;br /&gt;First, lets have a look at XSLT as edited in CoherentWeb:&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-anHb58fm-Vs/TlORN9TbJvI/AAAAAAAAAEs/TSVxToszzOs/s1600/xslt-whitespace.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-anHb58fm-Vs/TlORN9TbJvI/AAAAAAAAAEs/TSVxToszzOs/s1600/xslt-whitespace.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Original XSLT - Clean of formatting characters&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;Before going on to review the output, lets switch the view to the left-justified, so we can check the alignment of text, no characters are modified for the view here, the left-margin is just collapsed. We can see clearly that 'Books' along with the '------' underline are going to be indented in the output, with the rest of the output text aligned to the left margin:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-hacTuY_mCIk/TlOTnigepGI/AAAAAAAAAE4/pBSh8rWZ6hI/s1600/xslt-whitespace-flat.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-hacTuY_mCIk/TlOTnigepGI/AAAAAAAAAE4/pBSh8rWZ6hI/s1600/xslt-whitespace-flat.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Now for the output which produces no surprises. The Books title is indented with space characters that were in the XSLT, all other lines are left-justified. The line-breaks are all output because they are in the XSLT as 'naked' text. The one exception is the line following ISBN, this is inserted using the value of $lf which has a line-feed \n as its string value. This is required because XSLT won't copy the whitespace-only node preceding the  end tag into the result-tree.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-f0UXXd2ARJo/TlOSXYBVmqI/AAAAAAAAAEw/kDr3M5GFWU0/s1600/xslt-output-trim.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-f0UXXd2ARJo/TlOSXYBVmqI/AAAAAAAAAEw/kDr3M5GFWU0/s1600/xslt-output-trim.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Original Output&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;So, the above XSLT was relatively simple because there were no extra formatting characters that other XSLT editors use. To emulate their behaviour, I opened the orginal XSLT file in another XSLT editor and then just saved it again. When this did was insert formatting characters into content because the other editor needed to render it in a formatted way and didn't have virtual formatting. Now, to be fair, I could have modified the settings of this editor so that it didn't format the XSLT when opened, but then it wouldn't have been rendered properly.&lt;br /&gt;&lt;br /&gt;Temporarily disabling CoherentWeb's normal &lt;i&gt;trim&lt;/i&gt; behaviour (which would detect and selectively removed formatting characters), I then opened the file modified by the other editor and it looked like this:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-5XZqD196TyM/TlOlUIBIRsI/AAAAAAAAAE8/5Ah4zp6R4Kk/s1600/xslt-whitespace-padding.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-5XZqD196TyM/TlOlUIBIRsI/AAAAAAAAAE8/5Ah4zp6R4Kk/s1600/xslt-whitespace-padding.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The yellow highlighting shows us&amp;nbsp;what the other XSLT editor did to our nice trim XSLT, look at all those space characters added for formatting!. Now, that other editor has been reasonably smart, because it knew the &lt;xsl:text&gt; element must preserve whitespace, so thankfully it didn't insert formatting characters here. It did however ignore the whitespace preceding the Books line, choosing instead to pad the line for XML formatting purposes as if the leading whitespace wasn't there. This means we can't just trim the XML to get back what we started with, because the information about the extra whitespace has been lost by that editor.&amp;nbsp;&lt;/xsl:text&gt;&lt;br /&gt;&lt;br /&gt;Now we have the file from the other editor, let's see what output we would get:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-sI2cgO9UTWY/TlOsEO3BkHI/AAAAAAAAAFA/7kFX4F_LStU/s1600/xslt-output-padding.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-sI2cgO9UTWY/TlOsEO3BkHI/AAAAAAAAAFA/7kFX4F_LStU/s1600/xslt-output-padding.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;So, the extra space characters in the input are now being copied into the output. &amp;nbsp;The Books title is also no longer centered in the output formatting. This is expected behaviour for XSLT of course, all whitespace within a sequence contructor is significant unless it's within a whitespace-only node. The xsl:text element already mentioned is one way of remedying this, the extra effort required isn't too onerous, but for more complex XSLT it will affect readability:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-QDODqzWweq8/TlO0R9cfPJI/AAAAAAAAAFE/LlMLmdQOuLE/s1600/xslt-adapted.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-QDODqzWweq8/TlO0R9cfPJI/AAAAAAAAAFE/LlMLmdQOuLE/s1600/xslt-adapted.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The XSLT above has been modified to produce the required output, even when the XSLT has formatting whitespace characters inserted. The xsl:text element effectively turns the formatting characters into white-space only nodes which are not added to the result-tree. We also have to use instructions to insert line-feeds more frequently, I've used concat($lf, $lf) to this end.&lt;br /&gt;&lt;br /&gt;So, the XSLT is no longer susceptible to formatting characters, but the cost is more complex XSLT. With CoherentWeb, I would strongly advise that your XSLT is ultimately hardened to work with editors that don't have Virtual formatting capabilities. But at least while doing initial design and development you have the option to use XSLT that more closely resembles the output you need.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-1708319238139388606?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/1708319238139388606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2011/08/editing-virtually-formatted-xslt.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/1708319238139388606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/1708319238139388606'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2011/08/editing-virtually-formatted-xslt.html' title='Editing Virtually Formatted XSLT'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-anHb58fm-Vs/TlORN9TbJvI/AAAAAAAAAEs/TSVxToszzOs/s72-c/xslt-whitespace.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-4264332225896089</id><published>2011-08-19T21:00:00.023+01:00</published><updated>2011-08-19T22:22:13.026+01:00</updated><title type='text'></title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;h1&gt;Virtual Formatting&lt;/h1&gt;&lt;h3&gt;Writing an XSLT Editor - Part 2&lt;/h1&gt;&lt;br /&gt;For more than 6 months now I've been developing the concept of virtual formatting for the XML Editor now integrated into CoherentWeb. This concept is simply where XML text is indented by adjusting the left-margin, rather than using tab or space characters for the same end. There's nothing new in this idea, web browsers use virtual formatting each time they're used to view an XML file, they don't go to the trouble of modifying the content, just the way it's rendered.&lt;br /&gt;&lt;br /&gt;What works well as an XML viewing concept, however, is an entirely different beast when its used in an environment where, as in an XML editor, the text is potentially changed as quickly as someone can type. The rewards though are huge, bringing a whole new editing experience that is immediate and compelling, as this 5 minute video hopefully demonstrates:&lt;br /&gt;&lt;br /&gt;Video:&amp;nbsp;&lt;a href="http://qutoric.com/coherentweb/video/xmleditor/" style="color: blue;"&gt;&lt;i&gt;Imagine an XML Editor that could..&lt;/i&gt;.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I should probably explain something about the formatting rules used by CoherentWeb:&lt;br /&gt;&lt;br /&gt;First, XML formatting is not standardised in any way, but CoherentWeb follows a set of conventions in common use, its these that I've attempted to isolate and describe here. Below is some XML text with no indentation (a screenshot of the XML Editor in left-justified mode), the blocks where different formatting rules apply have been highlighted and annotated:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-IpkVVh6mCTY/Tk6GA8NFNeI/AAAAAAAAAEU/Fh_DCG2DdwI/s1600/blog-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-IpkVVh6mCTY/Tk6GA8NFNeI/AAAAAAAAAEU/Fh_DCG2DdwI/s1600/blog-1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Let's just see how this XML is formatted when in indented mode before going on to look at each block:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-I4JV0FUSnbw/Tk6L8jbG4PI/AAAAAAAAAEc/xCL1gpOMBKs/s1600/blog-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-I4JV0FUSnbw/Tk6L8jbG4PI/AAAAAAAAAEc/xCL1gpOMBKs/s1600/blog-2.png" /&gt;&lt;/a&gt;&lt;/div&gt;The (background-highlighted) screenshot above shows the same XML as the first screenshot, but this time indented. The block coloring is to associate the indented blocks with their non-indented equivalents that are also annotated.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;1. Namespace Declarations&lt;/h3&gt;These occur within the element start tag and the same indentation convention is applied as for attributes.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;2a. Attribute Names - where the first attribute is on the same line as the element tag&lt;/h3&gt;In this case, if subsequent attributes start on new lines then they are aligned with the start of the first attribute name.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;2b. Attribute Names - where the first attribute is on a new line&lt;/h3&gt;The first attribute is indented by the same fixed amount as if it were element content. Any subsequent attributes on new lines are indented likewise, so they are all left-aligned.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;3. Element Tags and content&lt;/h3&gt;We're all very familiar with the basic formatting rules for elements and their content, but to reiterate: XML element open and close tags establish the hierarchy of an XML document. Each new open tag marks a new, higher level, of nesting; the entire contents between the open and close tags is therefore indented by a fixed amount to indicate each new level of nesting. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;4. Attribute Values&lt;/h3&gt;When attribute values extend over several lines, the start of each new line is aligned with the very start of the attribute value. Attribute values may have their own indentation (as shown) outside of the XML context. Unless schema rules indicate other wise, the whitespace used for indentation of attribute values is normalized, it's therefore mainly used to assist in the readability of the XML text.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;5. Mixed Content&lt;/h3&gt;If an element contains mixed content, then the contents of 'inline' elements is not indented any further than the container element warrants, allowing the text, complete with inline elements to be viewed as a single block.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;6. Preformatted Element Content&lt;/h3&gt;An XML vocabulary may require that all whitespace content within specific elements is preserved, this is either indicated by the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;xml:space="preserve"&lt;/span&gt; attribute value setting, or declared in a schema defining the element. With virtual formatting, the content can still be rendered indented in the normal way because no characters have to be added to acheive this.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Virtual formatting content with padding characters&lt;/h3&gt;Currently, most hand-crafted XML has tab or space characters inserted for formatting, even XML processors such as XSLT (optionally) add whitespace for indentation. For virtual formatting, these characters are removed on loading a file or on clipboard operations.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Editing Benefits&lt;/h3&gt;The screenshot below shows the XML Editor with the same contents as the previous screenshot, but with all characters including whitespace highlighted in yellow:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-yu0GoAXH5kM/Tk67lmepF2I/AAAAAAAAAEg/lv6rrTVh7gM/s1600/blog-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-yu0GoAXH5kM/Tk67lmepF2I/AAAAAAAAAEg/lv6rrTVh7gM/s1600/blog-3.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This screenshot helps illustrate how, by dispensing with padding characters, virtual formatting gives absolute control to the user over all content of an XML file and how it's rendered.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-4264332225896089?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/4264332225896089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2011/08/virtual-formatting-writing-xslt-editor.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4264332225896089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4264332225896089'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2011/08/virtual-formatting-writing-xslt-editor.html' title=''/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-IpkVVh6mCTY/Tk6GA8NFNeI/AAAAAAAAAEU/Fh_DCG2DdwI/s72-c/blog-1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-4783189619255656372</id><published>2011-08-16T11:42:00.000+01:00</published><updated>2011-08-16T11:42:14.801+01:00</updated><title type='text'>CoherentWeb 4.0 Release - Writing an XSLT Editor - Part I</title><content type='html'>CoherentWeb 4.0 has just been released. This marks the culmination in an effort lasting well over 6 months, to build an XSLT editor from scratch and blend it in seamlessly with CoherentWeb's XSLT-processing and XPath analysis tools.&lt;br /&gt;&lt;br /&gt;I'm pleased now that I didn't go for the easy solution of incorporating a 3rd party editor into the tool, tempting though it was. Building an XML editor from scratch allowed me to rethink some of the very fundamentals of editor design.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Initial State&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;CoherentWeb already had an XML text rendering system for viewing/analysis, it relied on .NET's XmlReader for parsing and a fallback parser for non well-formed XML (a modified version of MindTouch's SgmlReader). This approach though, was clearly unsuited for an editor, where each and every character found must be faithfully reproduced, no matter what (almost, more on that later). A fresh think was required:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Considering the XML source&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;There are 2 main parts to rendering XML text for viewing, syntax coloring and indentation. Files opened from other sources may already have padding characters for indentation, but they may not, so indentation was definitely needed on loading. The optimal solution would be of course to use the same code when loading a file as that used to reformat text when it was being edited. For optimal performance, this would require indentation and syntax-coloring to be performed in the same pass.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Using RTF codes for indentation&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The base control for rendering text was .NET's RichTextBox (InkEdit is actually used as it's a later version and has better performance), this is effectively the same control used by WordPad in Windows, so has excellent RTF rendering capability. My natural though process went along the lines that, if you're generating RTF to colour XML text you can also use RTF to indent it, it didn't even occur to me that inserting padding characters was a viable alternative, adding characters to text in the middle of the parsing process would complicated things further (though line-feed characters for XML formatting must be added if not present in the source, this is less frequent)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Trimming the source&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;There was just one issue though, a big one, what if there were padding characters in the XML source? This would interfere with any RTF-based indentation, so there must be a capability to remove it, so we're not adding characters whilst parsing, but we are removing them, how can this be kept simple without having offset values all over the place? The compromise was for the parser to run a second time on the modified text, but with all RTF-related calls ignored. On the second pass, the only updates required were for the node positions.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The XML Model - A Frozen String&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;To be really effective, an XML Editor needs to know exactly where the text/mouse cursor is at all times, in the context of the XML. A model of the XML is therefore required that maps directly onto character positions. In this design, the internal model only stores XML node-context and associated character positions as integers, no text is stored, either for names or values. This is similar to the concept of the Frozen-Stream pattern, but we have a string instead of a stream. As well as tracking text position, the model also needs information on the node hierarchy to permit XML-aware operations, and to synchronise with a lazy-loading XML outline, in the form of a TreeView. This model needs to be efficient because it is updated on every keystroke.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A lot happens in an XML text editor, even before the XML text is rendered. But what happens here is critical, because it defines the functionality available and responsiveness when the XML text is actually edited. I've skipped over the way nodes are parsed because this is pretty standard stuff, the key is that rolling your own parser means that no character information is lost. It also made it possible to do non-standard &amp;nbsp;processing, such as parsing XML comments independently, in case they contained XML (so XML is indented properly in comments, also without padding).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-4783189619255656372?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/4783189619255656372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2011/08/coherentweb-40-release-writing-xslt.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4783189619255656372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4783189619255656372'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2011/08/coherentweb-40-release-writing-xslt.html' title='CoherentWeb 4.0 Release - Writing an XSLT Editor - Part I'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-4122058361433437316</id><published>2011-06-29T18:56:00.003+01:00</published><updated>2011-07-04T08:15:06.804+01:00</updated><title type='text'>A taste of things to come</title><content type='html'>Here at Qutoric, development has been progressing at a frantic pace in preparation for CoherentWeb V4.0.&lt;br /&gt;&lt;br /&gt;The most significant change in the forthcoming release is that this XSLT batch-processing system will (for the first time) include XML editing capabilities. The fully featured XML editor means that CoherentWeb will provide an interesting alternative to conventional XSLT IDEs which include more limited batch-processing&amp;nbsp;capabilities.&lt;br /&gt;&lt;br /&gt;Some 'Coming Soon' screenshots of the product:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-_A1Cr0kBVLw/Tgtf0dUMYEI/AAAAAAAAADI/nuGPdWeHm48/s1600/screen-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="227" src="http://3.bp.blogspot.com/-_A1Cr0kBVLw/Tgtf0dUMYEI/AAAAAAAAADI/nuGPdWeHm48/s400/screen-1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;i&gt;The Configure Panel: Desktop XML Processing starts here&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://1.gvt0.com/vi/j72znvl7O2E/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/j72znvl7O2E&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/j72znvl7O2E&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;i&gt;Introducing Virtual Formatting in CoherentWeb's XML Editor&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-KafbN4B6O3g/TgthYjw4E0I/AAAAAAAAADM/KdKUlZrTuo4/s1600/screen-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="228" src="http://2.bp.blogspot.com/-KafbN4B6O3g/TgthYjw4E0I/AAAAAAAAADM/KdKUlZrTuo4/s400/screen-2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;XML Editor: Fully integrated into a multi-threaded XSLT batch-processing system&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-UFJOmwGbGoE/TgtiOL2zhvI/AAAAAAAAADQ/RJdxNfLl2p0/s1600/new-objects-slateblue-hinesting-s.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-UFJOmwGbGoE/TgtiOL2zhvI/AAAAAAAAADQ/RJdxNfLl2p0/s1600/new-objects-slateblue-hinesting-s.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;Edit XML with full virtual indentation or in a flattened view (as shown)&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-2njYtxdz1q8/Tgtjskr8BrI/AAAAAAAAADU/xiW1fSy_QCM/s1600/multimonitor.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-2njYtxdz1q8/Tgtjskr8BrI/AAAAAAAAADU/xiW1fSy_QCM/s1600/multimonitor.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;i&gt;Multi-Monitor support designed in from the very beginning&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-3mHO4KcVYKM/TgtkpfyaHPI/AAAAAAAAADY/zQKqbVLNxd8/s1600/printing.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-3mHO4KcVYKM/TgtkpfyaHPI/AAAAAAAAADY/zQKqbVLNxd8/s1600/printing.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&amp;nbsp;Print XML with full indented formatting, word-wrap and line-numbering options&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-vK8ZDPuROY0/Tgtl2JshK1I/AAAAAAAAADc/h7-HWM4oK-w/s1600/xpath.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-vK8ZDPuROY0/Tgtl2JshK1I/AAAAAAAAADc/h7-HWM4oK-w/s1600/xpath.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;i&gt;Enhanced XPath Development Environment - with full trace/debug features&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;There's much more of course, but hopefully the above provides a flavour of what you can expect...very soon now.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-4122058361433437316?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/4122058361433437316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2011/06/taste-of-things-to-come.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4122058361433437316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4122058361433437316'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2011/06/taste-of-things-to-come.html' title='A taste of things to come'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-_A1Cr0kBVLw/Tgtf0dUMYEI/AAAAAAAAADI/nuGPdWeHm48/s72-c/screen-1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-7580211742212027903</id><published>2010-09-27T17:28:00.012+01:00</published><updated>2010-09-29T15:59:12.566+01:00</updated><title type='text'>Using XSLT/EXPath with Word 2010</title><content type='html'>&lt;p&gt;The EXPath Zip module shows great potential for publishers wishing to create documents that are XML based but rely on Zip-Compressed packages to bring related data together into a single file.&lt;/p&gt;A number of well established standards such as ODF, XPS and ePub use Zip for this purpose, but in this example I chose the OOXML standard, as used by Microsoft Word 2010.&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/QEuBdbBpdjw?fs=1&amp;amp;hl=en_GB"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/QEuBdbBpdjw?fs=1&amp;amp;hl=en_GB" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;p&gt;The presentation (above) describes the general approach used, a screencast (below) shows the XSLT in action. Developing the XSLT itself was relatively straightforwards because of the declarative approach EXPath ZIP uses for describing the ZIP file structure and contents. There was just one minor issue, the sample OData file I used had bmp files  embedded using Base64 encoding, however the first 78 bytes of these were just header info - I therefore introduced a (non-standard) 'offset' attribute to the zip:entry element, to allow these first 78 bytes to be ignored.&lt;/p&gt;&lt;br /&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/T4jnzrLEd08?fs=1&amp;amp;hl=en_GB&amp;amp;color1=0x3a3a3a&amp;amp;color2=0x999999"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/T4jnzrLEd08?fs=1&amp;amp;hl=en_GB&amp;amp;color1=0x3a3a3a&amp;amp;color2=0x999999" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;Links for the files used are below. If you wish to use the XSLT, you will need to change the $word-in-href and $output variables that correspond to the locations of the resource and output files, to suit your own system:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://qutoric.com/expath/sample1/EmployeeSummary2.docx"&gt;Word Template $word-in-href&lt;/a&gt;&lt;br /&gt;&lt;a href="http://qutoric.com/expath/sample1/expath-test4.xsl"&gt;XSLT File&lt;/a&gt;&lt;br /&gt;&lt;a href="http://qutoric.com/expath/sample1/Employees.xml"&gt;OData Input File&lt;/a&gt;&lt;br /&gt;&lt;h4&gt;Non-Standard Extension to EXPath&lt;/h4&gt;&lt;br /&gt;As explained in the video presentatation, a non-standard 'offset' attribute for the zip:entry element was used to describe the Base64 output. This was because, after conversion from Base64, the first 78 bytes of the binary needed to be discarded as they contained header data that would otherwise have made the bmp file invalid.&lt;br /&gt;Due to this non-standard attribute, this XSLT can only be run unaltered on &lt;a href="http://coherentweb.com/"&gt;the CoherentWeb XSLT test tool&lt;/a&gt;. If, however, this is found to be a common use case, it may be possible however for this to be added to the &lt;a href="http://www.expath.org/modules/zip/"&gt;EXPath ZIP&lt;/a&gt; specification, which is still awaiting formal documentation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-7580211742212027903?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/7580211742212027903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2010/09/using-xsltexpath-with-word-2010.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/7580211742212027903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/7580211742212027903'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2010/09/using-xsltexpath-with-word-2010.html' title='Using XSLT/EXPath with Word 2010'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-2342029030109352737</id><published>2010-06-04T16:43:00.006+01:00</published><updated>2010-06-06T16:16:34.587+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Schematron XSLT Saxon CoherentWeb'/><title type='text'>ISO Schematron loader for Saxon.Net and C#</title><content type='html'>&lt;p style="font-family: arial;"&gt;I'm introducing an ISO Schematron 'compiler' into the &lt;a href="http://coherentweb.com/"&gt;CoherentWeb&lt;/a&gt; XSLT tool. This uses the open source XSLT implementation available from &lt;a href="http://www.schematron.com/"&gt;http://www.schematron.com/&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_E6YrHI04IKI/TAkqemlWDNI/AAAAAAAAACI/KG6sqBBg_Gk/s1600/list.png"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 176px; height: 209px;" src="http://4.bp.blogspot.com/_E6YrHI04IKI/TAkqemlWDNI/AAAAAAAAACI/KG6sqBBg_Gk/s320/list.png" alt="" id="BLOGGER_PHOTO_ID_5478957126914542802" border="0" /&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;To load a schema into CoherentWeb, first press: &lt;span style="font-family:courier new;"&gt;Schematron &gt; [SVRL | MSG] &lt;/span&gt;(underneath the 'Recent XSLT' list) to generate the XSLT.&lt;/span&gt;&lt;p style="font-family: arial;"&gt;With this XSLT, you can now initiate a multi-threaded batch-validation of the set of files (zip-compressed or otherwise) by just pressing F5 &lt;f5&gt;.&lt;/f5&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;After validating, you can review the SVRL output for any file by switching the XML viewer to 'Output' and browsing through the file list. Alternatively, with xsl:message output selected, you can see validation failures 'at a glance' from the file-list icons (see figure), and the adjacent message box&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;CoherentWeb is a proprietary app written in C# and uses a bundled &lt;a href="http://saxonica.com/"&gt;Saxon.NET&lt;/a&gt; 9.2 PE processor. The C# code used for compiling the schema into XSLT is shown below, error-checking and XSLT parameter handling code has been (mostly) removed&lt;/span&gt;.&lt;br /&gt;&lt;/p&gt;&lt;pre style="font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; border: 1px dashed rgb(153, 153, 153); line-height: 14px; padding: 5px; overflow: auto; width: 100%;"&gt;&lt;code&gt;          public static string ImportSchematron(string schemaPath, bool forMessage,&lt;br /&gt;Processor sxnProc, List&amp;lt;Xslt2Parameter&amp;gt; paramsList)&lt;br /&gt;     {&lt;br /&gt;         string outPath = CreateDerivedXslPath(schemaPath, forMessage);&lt;br /&gt;&lt;br /&gt;         string baseXsltPath = Settings.ResourceFilePath + "\\xslt\\";&lt;br /&gt;&lt;br /&gt;         string[] schConverter = new string[] {&lt;br /&gt;             baseXsltPath + "iso_dsdl_include.xsl",&lt;br /&gt;             baseXsltPath + "iso_abstract_expand.xsl",&lt;br /&gt;             baseXsltPath + "iso_svrl_for_xslt2.xsl"&lt;br /&gt;         };&lt;br /&gt;&lt;br /&gt;         if (forMessage)&lt;br /&gt;         {&lt;br /&gt;             schConverter[2] = baseXsltPath + "iso_schematron_message_xslt2.xsl";&lt;br /&gt;         }&lt;br /&gt;&lt;br /&gt;         Uri schemaUri = new Uri(schemaPath);&lt;br /&gt;&lt;br /&gt;         XsltCompiler xslComp = sxnProc.NewXsltCompiler();&lt;br /&gt;         //////transform-1/////&lt;br /&gt;         Uri xslUri = new Uri(schConverter[0]);&lt;br /&gt;    &lt;br /&gt;         XsltExecutable xslExec = xslComp.Compile(xslUri);&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;         XsltTransformer xslTrans = xslExec.Load();&lt;br /&gt;         LoadAllXslt2Params(xslTrans, paramsList);&lt;br /&gt;         DomDestination domOut1 = new DomDestination(new XmlDocument());&lt;br /&gt;         using(FileStream fs = File.Open(schemaPath, FileMode.Open))&lt;br /&gt;         {&lt;br /&gt;             xslTrans.SetInputStream(fs, schemaUri); // set baseUri&lt;br /&gt;           xslTrans.Run(domOut1);&lt;br /&gt;         }&lt;br /&gt;         //////transform-2/////&lt;br /&gt;         xslUri = new Uri(schConverter[1]);&lt;br /&gt;         xslExec = xslComp.Compile(xslUri);&lt;br /&gt;&lt;br /&gt;         xslTrans = xslExec.Load();&lt;br /&gt;         LoadAllXslt2Params(xslTrans, paramsList);&lt;br /&gt;         DomDestination domOut2 = new DomDestination(new XmlDocument());&lt;br /&gt;         DocumentBuilder docBuilder = sxnProc.NewDocumentBuilder();&lt;br /&gt;         docBuilder.BaseUri = schemaUri;&lt;br /&gt;         XdmNode inputDoc2 = docBuilder.Wrap(domOut1.XmlDocument);&lt;br /&gt;&lt;br /&gt;         xslTrans.InitialContextNode = inputDoc2;&lt;br /&gt;         xslTrans.Run(domOut2);&lt;br /&gt;&lt;br /&gt;         //////transform-3/////&lt;br /&gt;         xslUri = new Uri(schConverter[2]);&lt;br /&gt;         xslExec = xslComp.Compile(xslUri);&lt;br /&gt;         xslTrans = xslExec.Load();&lt;br /&gt;         LoadAllXslt2Params(xslTrans, paramsList);&lt;br /&gt;         XdmNode inputDoc3 = docBuilder.Wrap(domOut2.XmlDocument);&lt;br /&gt;         xslTrans.InitialContextNode = inputDoc3;&lt;br /&gt;         Serializer serializer = new Serializer();&lt;br /&gt;         using (TextWriter tw = new StreamWriter(outPath, false))&lt;br /&gt;         {&lt;br /&gt;             serializer.SetOutputWriter(tw);&lt;br /&gt;             serializer.SetOutputProperty(Serializer.INDENT, "no");&lt;br /&gt;             xslTrans.Run(serializer);&lt;br /&gt;         }&lt;br /&gt;         return outPath;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-2342029030109352737?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/2342029030109352737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2010/06/iso-schematron-loader-for-saxonnet-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/2342029030109352737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/2342029030109352737'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2010/06/iso-schematron-loader-for-saxonnet-and.html' title='ISO Schematron loader for Saxon.Net and C#'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_E6YrHI04IKI/TAkqemlWDNI/AAAAAAAAACI/KG6sqBBg_Gk/s72-c/list.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-5123807844017205702</id><published>2010-02-08T18:27:00.005Z</published><updated>2010-02-08T20:03:55.698Z</updated><title type='text'>Launch Day</title><content type='html'>Its finally happened. After 6 months intense work, covering about 25,000 lines of c# code, CoherentWeb has been 'launched' in beta form.&lt;br /&gt;&lt;br /&gt;Naturally, I'm very excited about this product launch. This tool attempts to introduce a significant number of innovations to the world of XML developers. My last post covered some of the unique user interface aspects, and these really reflect that CoherentWeb doesn't fit an existing tool category well at all.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_E6YrHI04IKI/S3BsZ_ZFdqI/AAAAAAAAACA/ROLkoV5qANA/s1600-h/multi-monitor2.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 128px;" src="http://3.bp.blogspot.com/_E6YrHI04IKI/S3BsZ_ZFdqI/AAAAAAAAACA/ROLkoV5qANA/s320/multi-monitor2.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5435963944005367458" /&gt;&lt;/a&gt;&lt;br /&gt;There are, of course, risks inherent in assuming that there's a functionality gap that needs filling with a new kind of tool. Its quite a leap to think that, if there were truly a gap, then you just happen to be the first developer to realise.&lt;/p&gt;&lt;br /&gt;Another problem, ironically, is the ubiquity of XML in todays world of IT solutions. Trying to build a tool generic enough to suit all XML developers, makes it quite possible to produce one that suits none.&lt;br /&gt;&lt;br /&gt;So there we have it. The question that so many startups before Qutoric is now being asked. Is there a sufficient market for this product?&lt;br /&gt;As for the answer, only time will tell...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-5123807844017205702?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/5123807844017205702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2010/02/launch-day.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/5123807844017205702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/5123807844017205702'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2010/02/launch-day.html' title='Launch Day'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_E6YrHI04IKI/S3BsZ_ZFdqI/AAAAAAAAACA/ROLkoV5qANA/s72-c/multi-monitor2.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-2145123037159155791</id><published>2009-10-23T14:44:00.002+01:00</published><updated>2009-10-23T15:26:52.380+01:00</updated><title type='text'>XML Tools: User Interface Design</title><content type='html'>Working on CoherentWeb has provided me with some useful experience on User Interface Design issues in the context of XML IDEs. What follows is a random list of miscellaneous thoughts on this subject.&lt;br /&gt;&lt;br /&gt;Icon Design:&lt;br /&gt;There is now a trend to minimise the cluttered appearance by minimising the complexity and colour-set of the icons used. Hopefully this reduces distraction and will allow the user to concentrate more on the data they're analysing or modifying rather that the aesthetics of the host IDE itself.&lt;br /&gt;&lt;br /&gt;Intellisense:&lt;br /&gt;Most IDEs provid a single column popup intellisense list. Unfortunately there are often too many entry options in a specific context for this to be really useful (for example, when providing auto-completion for XPath expressions).&lt;br /&gt;&lt;br /&gt;An alternative approach that is being experimented with for CoherentWeb is to use multi-column intellisense that is also categorised so that, for example, function names are not randomly mixed within a list of node names.&lt;br /&gt;&lt;br /&gt;Window Pane Management:&lt;br /&gt;Managing multiple viewing panes within an IDE poses a number of challenges for the designer. By allowing the user to hide, collapse or re-orientate any pane, you quick reach a pretty enormous number of possible permutations for rendering these panes together.&lt;br /&gt;&lt;br /&gt;The solution here appears to be to offer a number of preset IDE pane configurations, perhaps aimed towards specific tasks and then let the user fine-tune things from there - more work on this is required.&lt;br /&gt;&lt;br /&gt;Screen resolution, aspect ratio and multi-monitor setups:&lt;br /&gt;More LCD monitors with a 'widescreen' 16:9 aspect ratio are now being used, placing one or more montiors alongside the main monitor dramatically increases this ratio.&lt;br /&gt;&lt;br /&gt;Aspect ratio therefore becomes quite an issue. The approach so far for CoherentWeb is to adopt a 'TweetDeck' approach where multiple vertical panes are used in most cases rather than the classic IDE look with the window split into both vertically and horizontally.&lt;br /&gt;&lt;br /&gt;The IPhone Influence:&lt;br /&gt;UI designers can't help but look at how the IPhone designers tackled usability issues for the smartphone. There are some useful tips to pick up here, designing applications for use with touch screens is another facet to consider. I currently use a Wacom tablet to test CoherentWeb usability, but this will need to advance if touch-screens become more popular.&lt;br /&gt;&lt;br /&gt;Why do many IDEs look so much the same?&lt;br /&gt;If you look at popular IDEs they all seem to share a family resemblance. Why is this? Visual Studio, Eclipse, Oxygen, XmlSpy, Stylus Studio...the list goes on.&lt;br /&gt;&lt;br /&gt;Does this mean that we've reached the peak in evolution of UI design for an IDE? I hope not. In fact, new products like Expression Blend and Expression Web for example do have a new take on the IDE appearance which is quite refreshing, but have they gone far enough? Microsoft introduced the Ribbon for Office 2007/2010, but this doesn't appear to have been adopted yet for developers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-2145123037159155791?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/2145123037159155791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2009/10/xml-tools-user-interface-design.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/2145123037159155791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/2145123037159155791'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2009/10/xml-tools-user-interface-design.html' title='XML Tools: User Interface Design'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-3317068739937657033</id><published>2009-08-03T07:01:00.003+01:00</published><updated>2009-08-03T07:22:25.577+01:00</updated><title type='text'>Ambitions</title><content type='html'>&lt;span style="font-family:arial;font-size:85%;"&gt;What would you like to do with your life?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;This is hopefully the question we ask ourselves each day, consciously or otherwise. Well, for me I've decided to listen to the answer that has been screaming at me for quite a while, and so its time to act, I'm starting my own business.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;Now, I realise this is going to be tough, very tough, but, I need to give this a chance. I'm going to be busy of course, there's a few issues to resolve like creating the company, organising accounts and sorting out legal support (just in case).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;The intention is to arrange things so I spend a minimal amount of time on business support, to allow me to maximise my time on what I enjoy most, designing and writing software applications for others.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt;More details in following blogs.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-3317068739937657033?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/3317068739937657033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2009/08/ambitions.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/3317068739937657033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/3317068739937657033'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2009/08/ambitions.html' title='Ambitions'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-3346501945230393434</id><published>2009-05-21T19:24:00.008+01:00</published><updated>2009-05-24T20:01:12.209+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SketchPath'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='Book'/><category scheme='http://www.blogger.com/atom/ns#' term='Chinese'/><title type='text'>In Print?</title><content type='html'>&lt;p align="left"&gt;&lt;a href="http://www.ptpress.com.cn/Book.aspx?id=12089"&gt;&lt;img id="BLOGGER_PHOTO_ID_5338350495358574322" style="FLOAT: right; MARGIN: 0px 0px 10px 10px; WIDTH: 117px; CURSOR: hand; HEIGHT: 166px" alt="" src="http://1.bp.blogspot.com/_E6YrHI04IKI/ShWhfeJg3vI/AAAAAAAAABg/37NJX7cTGQU/s320/chinese-xml.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I've just come across this:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ptpress.com.cn/Book.aspx?id=12089"&gt;http://www.ptpress.com.cn/Book.aspx?id=12089&lt;/a&gt;&lt;/p&gt;&lt;p&gt;ISBN】 978-7-115-19834-1&lt;br /&gt;&lt;br /&gt;I think this is the first published book on XML in which SketchPath gets a mention.&lt;br /&gt;&lt;br /&gt;The thing is, this is a Chinese language book, and as my linguistic skills are limited, I don't quite know what the website says about it.&lt;br /&gt;&lt;br /&gt;Anyway, thanks to the author who mentioned SketchPath, Google translator tells me that &lt;span style="color:#3333ff;"&gt;使用SketchPath调试XPath&lt;/span&gt; means 'Common XPath Debugger'.&lt;br /&gt;&lt;br /&gt;Some time ago I got some really useful comments on SketchPath, especially about non UTF-8 encoding such as GB2312, this was from a Chinese-Language technical author. So many thanks to him for his contribution, and perhaps its his book at this website?&lt;br /&gt;&lt;a href="http://www.ptpress.com.cn/Book.aspx?id=12089"&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-3346501945230393434?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/3346501945230393434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2009/05/in-print.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/3346501945230393434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/3346501945230393434'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2009/05/in-print.html' title='In Print?'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_E6YrHI04IKI/ShWhfeJg3vI/AAAAAAAAABg/37NJX7cTGQU/s72-c/chinese-xml.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-7276127310002082477</id><published>2009-05-18T22:45:00.011+01:00</published><updated>2009-05-22T22:23:23.526+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xpath'/><category scheme='http://www.blogger.com/atom/ns#' term='2007'/><category scheme='http://www.blogger.com/atom/ns#' term='Word'/><category scheme='http://www.blogger.com/atom/ns#' term='Addin'/><title type='text'>SketchPath Word 2007 Addin</title><content type='html'>A quick taster screencast of the SketchPath Word 2007 Addin. Works extremely well for analysing large XML files:&lt;br /&gt;&lt;br /&gt;&lt;object width="410" height="257"&gt;&lt;param name="movie" value="http://www.youtube.com/v/SpmgHgogftU&amp;amp;hl=en&amp;amp;fs=1&amp;amp;rel=0&amp;amp;color1=0x006699&amp;amp;color2=0x54abd6"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/SpmgHgogftU&amp;hl=en&amp;fs=1&amp;rel=0&amp;color1=0x006699&amp;color2=0x54abd6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="410" height="257.5"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-7276127310002082477?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/7276127310002082477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2009/05/sketchpath-word-2007-addin.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/7276127310002082477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/7276127310002082477'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2009/05/sketchpath-word-2007-addin.html' title='SketchPath Word 2007 Addin'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-7614572321937724283</id><published>2009-05-16T08:27:00.003+01:00</published><updated>2009-05-22T22:21:40.280+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML Prague 2009'/><title type='text'>XMLPrague 2009 Presentations</title><content type='html'>If you follow XML trends then you need to check out &lt;a href="http://www.xmlprague.cz/index.html"&gt;XMLPrague 2009&lt;/a&gt; if you haven't already.&lt;br /&gt;&lt;br /&gt;There are some really interesting, thought provoking video presentations here, my favourites:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;XML Schema 1.1 Update by Michael Kay&lt;/li&gt;&lt;li&gt;High-Performance XML (Using Frozen Streams) by Alex Brown&lt;/li&gt;&lt;li&gt;Exploring XProc by Norman Walsh&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;There are many more excellent presentations, kind of makes me wish I was there.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-7614572321937724283?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/7614572321937724283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2009/05/xmlprague-2009-presentations.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/7614572321937724283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/7614572321937724283'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2009/05/xmlprague-2009-presentations.html' title='XMLPrague 2009 Presentations'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-544505681401508801</id><published>2009-04-22T20:29:00.003+01:00</published><updated>2009-04-22T21:00:36.178+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XSLT 2.0'/><title type='text'>XSLT 2.0 Upgrade: Success?</title><content type='html'>The rather tricky question of where XSLT 2.0 has got to, comes up every now and again.&lt;br /&gt;&lt;br /&gt;Well, given the incredible benefits that XSLT 2.0 brings over 1.0, the more recent version seems to have severely underperformed, in terms of takeup.&lt;br /&gt;&lt;br /&gt;In my experience there has indeed been very good 2.0 adoption with XSLT-based custom solutions in the enterprise. This however is more than countered by the painfully slow adoption in the more popular and visible parts of the IT/Web industry, in areas such as javascript libraries, MSXML, Web Browsers, .NET Framework, Java/JEE, non-XML IDEs such as Eclipse, Netbeans, Visual Studio... the list goes on.&lt;br /&gt;&lt;br /&gt;What caused this?&lt;br /&gt;&lt;br /&gt;My own theory is that the failure of Microsoft to embrace XSLT 2.0 had a severe impact on adoption, both by its partners, but also by its competitors.&lt;br /&gt;&lt;br /&gt;What's going to fix this?&lt;br /&gt;&lt;br /&gt;Well, perhaps we just need a 'killer' application, one that would really pale XSLT 1.0, fine language as it is, into insignificance. The chances are it already exists on some dusty website with a small but enthusiastic following and a lowly page ranking, all that's needed is for one key industry player with enough imagination to find it and go for it...so come on!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-544505681401508801?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/544505681401508801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2009/04/xslt-20-upgrade-success.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/544505681401508801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/544505681401508801'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2009/04/xslt-20-upgrade-success.html' title='XSLT 2.0 Upgrade: Success?'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-8185084276931513032</id><published>2009-03-08T11:42:00.004Z</published><updated>2009-05-22T22:22:39.846+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xpath'/><category scheme='http://www.blogger.com/atom/ns#' term='Word 2007'/><category scheme='http://www.blogger.com/atom/ns#' term='Addin'/><title type='text'>SketchPath Word 2007 Addin Update</title><content type='html'>While very pleased with the technical outcome of branching SketchPath to be a Word 2007 Addin, there has been a very low takeup on this product, less the 1% of the 200+ downloads per week for the SketchPath product.&lt;br /&gt;&lt;br /&gt;Until I see any further public interest in this, I'll be concentrating on the standalone SketchPath version. Though I might first try a bit of additional 'marketing' for the Addin, one post to the &lt;a href="http://www.mulberrytech.com/xsl/xsl-list/"&gt;XSL-List&lt;/a&gt; is hardly exhaustive and is probably the wrong demographic anyway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-8185084276931513032?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/8185084276931513032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2009/03/sketchpath-windows-2007-addin-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/8185084276931513032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/8185084276931513032'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2009/03/sketchpath-windows-2007-addin-update.html' title='SketchPath Word 2007 Addin Update'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-493998639310123363</id><published>2009-03-08T11:18:00.004Z</published><updated>2009-09-03T17:05:00.853+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Saxon'/><category scheme='http://www.blogger.com/atom/ns#' term='XQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='XQSharp'/><title type='text'>XQuery and .NET</title><content type='html'>In a &lt;a href="http://sketchpath.blogspot.com/2008/05/microsoft-net-xquery-implementation.html"&gt;previous article&lt;/a&gt; I speculated that a Microsoft could be developing a .NET XQuery engine. I was wrong.&lt;br /&gt;&lt;br /&gt;There have however been some important developments with XQuery. One that I'm watching with interest is &lt;a href="http://www.xqsharp.com/xqsharp/about.htm"&gt;XQSharp&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;[Update Sep 3 2009] As per the comment below, XQSharp is now available for download, it can be purchased, but is free for evaluation or non-commercial use. &lt;s&gt;This looks promising because a .NET API for this is to be published, though there's some question as to whether use of this API will be free.&lt;/s&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;[Update Sep 3 2009] Saxon .NET 9.2 has been available for a few weeks now. There is a new range or Saxon versions, so check the site for details.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;In the mean time, &lt;a href="http://saxon.sourceforge.net/"&gt;Saxon&lt;/a&gt; remains, in my view, the best XQuery solution for .NET. The only issue issue I have with the Saxon approach is that this is a native Java app that uses IKVM files to port to .NET, this complicates deployment of dependent applications somewhat. I have though found the Saxon .NET API well documented and simple enough to use.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-493998639310123363?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/493998639310123363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2009/03/xquery-and-net.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/493998639310123363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/493998639310123363'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2009/03/xquery-and-net.html' title='XQuery and .NET'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-4113214547816805982</id><published>2009-02-15T15:02:00.006Z</published><updated>2009-05-22T22:24:23.996+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Large'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='Word 2007'/><category scheme='http://www.blogger.com/atom/ns#' term='File'/><title type='text'>Handling Large XML Files</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_E6YrHI04IKI/SZiD1VrmsaI/AAAAAAAAABY/BGQDVVlP6_g/s1600-h/docpath2.PNG"&gt;&lt;img style="MARGIN: 0px 0px 10px 10px; WIDTH: 320px; FLOAT: right; HEIGHT: 111px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5303133513605099938" border="0" alt="" src="http://2.bp.blogspot.com/_E6YrHI04IKI/SZiD1VrmsaI/AAAAAAAAABY/BGQDVVlP6_g/s320/docpath2.PNG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_E6YrHI04IKI/SZiCwqmE8oI/AAAAAAAAABQ/5TgYfXS1CmM/s1600-h/docpath.PNG"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 320px; FLOAT: left; HEIGHT: 169px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5303132333808087682" border="0" alt="" src="http://1.bp.blogspot.com/_E6YrHI04IKI/SZiCwqmE8oI/AAAAAAAAABQ/5TgYfXS1CmM/s320/docpath.PNG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;The Issue&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;A persistent feature request from SketchPath users has been for this XPath Tool to support larger XML files. The realistic current limitation is about 500KB, and even for this file size 'load performance' is close to being unacceptable.&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Word 2007&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;I'm still investigating options and will now trial a version of SketchPath that integrates with Word 2007 rather than using the .NET RichTextBox control. This should provide support for XML files up to about 20MB, which, bearing in mind that 4MB of XML is about 1600 pages, should answer some of the concerns.&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Ribbons&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;Using Word 2007 with .NET is very straightforwards now thanks to VS2008. There's even a Ribbon designer, though for any production version, its likely that I'll choose to generate XML to define the Ribbon as this provide more flexibility - especially when overriding existing Word functions.&lt;/div&gt;&lt;div&gt;&lt;strong&gt;The Approach - RTF&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;To minimise code changes, SketchPath for Word generates RTF from the XML source which is then loaded into Word in the background. There are alternatives of course but this solution already provides good performance and takes advantage of the way Word does 'progressive loading' for files.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;The Actions Pane&lt;/strong&gt;&lt;br /&gt;Word 2007 provides a very neat way of integrating with WinForms, this is via the ActionPanes control which works just like a .NET form and thus a container for any of the Winforms controls. The main limitation here is that it appears to only have one ActionsPane loaded at a time, it would have been nice to give users both a vertical and horizontal pane.&lt;br /&gt;&lt;strong&gt;Managing the Release&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;If this 'proof of concept' has some degree of success and there is to be a sister product to SketchPath then this will be managed to minimise the impact on the development and popularity of SketchPath. &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-4113214547816805982?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/4113214547816805982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2009/02/handling-large-xml-files.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4113214547816805982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4113214547816805982'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2009/02/handling-large-xml-files.html' title='Handling Large XML Files'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_E6YrHI04IKI/SZiD1VrmsaI/AAAAAAAAABY/BGQDVVlP6_g/s72-c/docpath2.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-3451802535261430614</id><published>2008-11-05T09:38:00.002Z</published><updated>2008-11-05T09:55:10.922Z</updated><title type='text'>Where next for SketchPath?</title><content type='html'>The SketchPath project has, in terms of download count, and Google PageRank been a qualified success. It does not however receive much feedback and needs your help to progress in the right direction, so please consider helping.&lt;br /&gt;&lt;br /&gt;What features or enhancements would you like to see in SketchPath? Or what particular annoyances need to be fixed?&lt;br /&gt;&lt;br /&gt;I've listed below some of the areas I'm considering, which of these would you like to see - what should the priorities be? Anything else?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Handle larger file sizes [up to 20 MB] with acceptable UI responsiveness&lt;/li&gt;&lt;li&gt;Tidy up User Interface&lt;/li&gt;&lt;li&gt;Improved Multi-File support for Collection() function&lt;/li&gt;&lt;li&gt;Support XInclude&lt;/li&gt;&lt;li&gt;Web Service Support (SOAP/REST)&lt;/li&gt;&lt;li&gt;XPath Update Support&lt;/li&gt;&lt;li&gt;Schema-Aware Enhancements&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-3451802535261430614?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/3451802535261430614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2008/11/where-next-for-sketchpath.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/3451802535261430614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/3451802535261430614'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2008/11/where-next-for-sketchpath.html' title='Where next for SketchPath?'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-7749582045042215789</id><published>2008-10-27T19:37:00.005Z</published><updated>2008-10-29T23:13:34.267Z</updated><title type='text'>Getting the User Interface</title><content type='html'>I found the following on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;StackOverflow&lt;/span&gt; a couple of days ago:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/238177/worst-ui-youve-ever-used"&gt;http://stackoverflow.com/questions/238177/worst-ui-youve-ever-used&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The 'nomination' for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;SketchPath&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#663300;"&gt;&lt;em&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;SketchPath&lt;/span&gt; is a tool I use often, and I despise its &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;UI&lt;/span&gt;.  Utterly confusing, needlessly complex, non-intuitive...  But its the best &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;xpath&lt;/span&gt; tool I've found so far.  Using it speaks volumes for the need to hide "expert" &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;ui&lt;/span&gt; components from the average user.&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;SketchPath&lt;/span&gt; comes in here for a fair degree of criticism. This is the first bit of really unfavourable feedback I've seen on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;SketchPath&lt;/span&gt;, so its important to see if I can learn something from this if possible without getting too defensive, or even too analytical.&lt;br /&gt;&lt;br /&gt;The main point that comes &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;accross&lt;/span&gt; is the apparently contradictory notion that though &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;SketchPath&lt;/span&gt; has the 'worst ever' &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;UI&lt;/span&gt;, it is still used frequently by the poster and is the best tool they've managed to find so far. My initial thoughts are that, perhaps in some kind of twisted way, the poor &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;UI&lt;/span&gt; actually makes the tool good.&lt;br /&gt;&lt;br /&gt;Now, obviously no tool's &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;UI&lt;/span&gt; is going to appeal to all users, but to get such emotive terms as 'despise' means that something has gone wrong, so what did go wrong, and why?&lt;br /&gt;&lt;br /&gt;Well, again the poster has been very helpful by explaining the problem; overly complex user interface and non-intuitive. My response? Guilty as charged I'm afraid - there are many controls on the main screen that could have been easily hidden away and saved for some 'expert mode'. Also, many controls are used in unconventional ways, let me list some &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_13"&gt;idiosyncrasies&lt;/span&gt; just one control, the 'Assist Pane':&lt;br /&gt;&lt;ol&gt;&lt;li&gt;A grid control is used for the 'Assist Pane' instead of perhaps the more obvious menu bar.&lt;/li&gt;&lt;li&gt;A scrollable '&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;IntelliSense&lt;/span&gt;' list is embedded within the non-scrollable grid control&lt;/li&gt;&lt;li&gt;The '&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;IntelliSense&lt;/span&gt;' list is enclosed within 2 toolbar columns that also don't scroll&lt;/li&gt;&lt;li&gt;One column of the grid is 'paged' by clicking on the column header&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;You probably get the idea by now, there are some pretty strange things going on here, and they should be non-intuitive because it's unlikely that users will have come across this behaviour before. Was this wrong? Well, that's for you to decide, it certainly flouts Steve Krug's cardinal web site usability rule: 'Don't Make Me Think'.&lt;br /&gt;&lt;br /&gt;To be honest, a screenshot can not do justice to how different this UI really is, its the dynamic behaviour that must settle it for most - one way or the other.&lt;br /&gt;&lt;br /&gt;So, did I make a mistake in experimenting in this way? I don't yet know. Its important anyway that conventions used in tools are challenged and evolve, both to reflect new uses but also the new capabilities of GUI frameworks like WPF, and, perhaps just to keep things interesting.&lt;br /&gt;&lt;br /&gt;The following facts may also shed some light on some design decisions:&lt;br /&gt;&lt;br /&gt;Half of recent development effort was done on a laptop with a low-res 15.4 inch screen and no mouse, the other half on an overclocked workstation with a 24 inch screen, plus mouse.&lt;br /&gt;I have only a limited set of free icons that I can use, and my graphic design skills are poor&lt;br /&gt;I suffer from intermittent RSI, most likely causes: Mouse scroll-wheels and right-clicking&lt;br /&gt;I find Mobile Phone UI's (pre-IPhone) surprisingly effective once you're accustomed to them&lt;br /&gt;A high percentage of SketchPath users will never look at the online documentation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-7749582045042215789?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/7749582045042215789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2008/10/getting-user-interface.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/7749582045042215789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/7749582045042215789'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2008/10/getting-user-interface.html' title='Getting the User Interface'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-5003328064576785108</id><published>2008-07-11T14:25:00.001+01:00</published><updated>2008-10-27T19:37:39.600Z</updated><title type='text'>Microsoft XML Tools: Have your say</title><content type='html'>The Microsoft XML Team is conducting a survey for XML Tools at:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/xmlteam/archive/2008/07/01/xml-tools-and-technology-survey.aspx"&gt;http://blogs.msdn.com/xmlteam/archive/2008/07/01/xml-tools-and-technology-survey.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Curious? Why not have a look. The questions provide some insight into where Microsoft XML tools might be heading (Question 29 for example), and you might as well have your say at the same time.&lt;br /&gt;&lt;br /&gt;[Edit: The Survey is now closed, sorry for not updating this earlier - Question 29 was asking whether you would like the capability for Visual Studio to be used with 2nd party XML/XSLT processors]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-5003328064576785108?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/5003328064576785108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2008/07/microsoft-xml-tools-have-your-say.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/5003328064576785108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/5003328064576785108'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2008/07/microsoft-xml-tools-have-your-say.html' title='Microsoft XML Tools: Have your say'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-5678674278201468439</id><published>2008-07-09T17:13:00.001+01:00</published><updated>2008-07-09T17:13:39.049+01:00</updated><title type='text'>SketchPath Demo Video</title><content type='html'>&lt;script type="text/javascript" src="http://cs4a.clearspring.com/o/46928cc51133af17/4874e3b265ae3098/46928cc5788deb29/a3d7d11a/widget.js"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-5678674278201468439?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/5678674278201468439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2008/07/sketchpath-demo-video.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/5678674278201468439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/5678674278201468439'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2008/07/sketchpath-demo-video.html' title='SketchPath Demo Video'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-8145670294125084429</id><published>2008-06-11T12:08:00.003+01:00</published><updated>2009-05-22T22:24:38.978+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><title type='text'>The move to WPF</title><content type='html'>Now SketchPath has got XPath 2.0 support built-in, the next stage is to more to using the .NET WPF and XAML, to give this tool more flexibility.&lt;br /&gt;&lt;br /&gt;Progress has been fairly slow with WPF as I try out different techniques. Initial impressions are that this is an extremely powerful environment for developing visually rich applications. The cost however is that there is some additional complexity, because the 'off the shelf' controls really need to be modified to get the most from WPF.&lt;br /&gt;&lt;br /&gt;Now, the bridging between XAML and C# can be somewhat tricky. XAML dependency properties need to map to CLR properties. XAML ControlTemplates are a very powerful way of enhancing existing controls. However, if you need to add extra properties to your control you need to dip into c# to create a Custom Control class. This acts as a useful wrapper and registers dependency properties with equivalent CLR properties.&lt;br /&gt;&lt;br /&gt;The biggest issue seems to be referencing XAML resources such as a ControlTemplate from within c#. As an interim measure I'm actually using a hidden control's instance (declared in XAML) to get a handle on that control's template dynamically in c# to create further controls (a custom TreeViewItem in this case) but there's got to be a better way. Whenever I come across a method starting with 'FindResource("name")' or even, 'TryFindResource' it makes me wary.&lt;br /&gt;&lt;br /&gt;Still, even with these teething problems, there's a significant improvement over Windows Forms. Because geometry and trigonometry are not my favourite subjects, I'm relying heavily on Expression Blend 2 to do much of the visual design work and Visual Studio 2008 Professional for the C# side. The integration between these two products is much better than it was, but its still not exactly seamless.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-8145670294125084429?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/8145670294125084429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2008/06/move-to-wpf.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/8145670294125084429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/8145670294125084429'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2008/06/move-to-wpf.html' title='The move to WPF'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-1531763670994957394</id><published>2008-06-11T11:03:00.004+01:00</published><updated>2008-06-11T11:37:29.007+01:00</updated><title type='text'>Top 10 XPath Expression Errors</title><content type='html'>My List of XPath expression errors I come across most frequently:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Attempted use of the default namespace in XPath 1.0&lt;/li&gt;&lt;li&gt;Incorrect loading of namespaces into the XPath evaluation environment&lt;/li&gt;&lt;li&gt;Use of &lt;span style="color:#009900;"&gt;a != b&lt;/span&gt; when &lt;span style="color:#009900;"&gt;not(a = b) &lt;/span&gt;&lt;span style="color:#000000;"&gt;is probably what was meant&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Mis-Capitalization. Either in location-paths or for operators (use 'and' not 'AND')&lt;/li&gt;&lt;li&gt;Using a predicate to find the &lt;em&gt;nth&lt;/em&gt; child node of each parent - wrap the expression in brackets - e.g.&lt;span style="color:#009900;"&gt; &lt;span style="color:#990000;"&gt;(&lt;/span&gt;/workbook/sheets&lt;span style="color:#cc0000;"&gt;)&lt;/span&gt;/sheet[&lt;em&gt;n&lt;/em&gt;]&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:#000000;"&gt;Assuming that nodes are zero-indexed - &lt;span style="color:#009900;"&gt;a[1]&lt;/span&gt; actually returns the first node&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Using a reverse-axis such as ancestor:: without considering the nodes are accessed this way in reverse-document order - &lt;span style="color:#009900;"&gt;sheet&lt;/span&gt;&lt;span style="color:#009900;"&gt;/ancestor::*[1]&lt;/span&gt; returns the node closest to element &lt;span style="color:#009900;"&gt;sheet &lt;/span&gt;&lt;span style="color:#000000;"&gt;- in other words its parent&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Misunderstanding of the real context node for a relative xpath expression (If the expression doesn't start with a '/' - then its relative to the context node which may be modified by the host language e.g. XSLT)&lt;/li&gt;&lt;li&gt;Overuse of the // expression for descendant-or-self - adversely affects performance&lt;/li&gt;&lt;li&gt;Errors due to an excessively lengthy expression that is hard to document. If in XSLT or XQuery, try using variables to make the expression clearer, and to help understand errors when they occur.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;XPath isn't hard. Its just that some expressions that look really simple, actually require a bit of extra thought and testing.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-1531763670994957394?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/1531763670994957394/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2008/06/top-7-xpath-expression-errors.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/1531763670994957394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/1531763670994957394'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2008/06/top-7-xpath-expression-errors.html' title='Top 10 XPath Expression Errors'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-2239544272365528410</id><published>2008-06-11T10:42:00.003+01:00</published><updated>2008-06-11T11:39:49.325+01:00</updated><title type='text'>A New XPath Tutorial</title><content type='html'>If you're new to XPath you might want to try out the following tutorial by Brett McLaughLin:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ibm.com/developerworks/edu/x-dw-x-introxpath1.html?S_TACT=105AGX01&amp;amp;S_CMP=HP"&gt;http://www.ibm.com/developerworks/edu/x-dw-x-introxpath1.html?S_TACT=105AGX01&amp;amp;S_CMP=HP&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is just the first part and you need to register on the IBM developerworks host site first.&lt;br /&gt;&lt;br /&gt;One thing to note is that this is an XPath 2.0 tutorial. Though this isn't mentioned explicitly, its clear from some small details in the contents of the first part. No doubt in subsequent parts things will become clearer, but it would have been nice to have seen this mentioned up front.&lt;br /&gt;&lt;br /&gt;The XPath tools recommended by Brett are &lt;a href="http://www.ditchnet.org/aquapath/"&gt;AquaPath&lt;/a&gt; for Mac OSX and &lt;a href="http://www.stylusstudio.com/"&gt;Stylus Studio&lt;/a&gt; for Windows.&lt;br /&gt;&lt;br /&gt;The tutorial and resources have a Java perspective on things but this should be useful to all developers new to XPath. No standalone XPath 2.0 processors are mentioned in the first part, but in my view, Java developers will probably go for &lt;a href="http://www.saxonica.com/"&gt;Saxon&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Disappointed that SketchPath doesn't get a mention, but I'm sure there's a good reason, probably commercial.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-2239544272365528410?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/2239544272365528410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2008/06/new-xpath-tutorial.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/2239544272365528410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/2239544272365528410'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2008/06/new-xpath-tutorial.html' title='A New XPath Tutorial'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-9014185571957340798</id><published>2008-06-03T18:41:00.003+01:00</published><updated>2009-05-22T22:25:06.844+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XSD'/><category scheme='http://www.blogger.com/atom/ns#' term='xpath'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='Linq'/><title type='text'>LINQ to XML / XSD and XPath 2.0</title><content type='html'>Much has been written comparing LINQ to XML with XPath 1.0.&lt;br /&gt;&lt;br /&gt;This is not a valid comparison, so to do my small bit to even things up, I'll briefly show XPath 2.0 (though I could as easily have used XQuery or XSLT 2.0) on a simple test case that was first illustrated &lt;a href="http://blogs.msdn.com/xmlteam/archive/2006/11/27/typed-xml-programmer-welcome-to-linq.aspx"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Sample 1: LINQ to XML:&lt;br /&gt;&lt;br /&gt;(&lt;span style="color:#3333ff;"&gt;from&lt;/span&gt; &lt;span style="color:#006600;"&gt;item&lt;/span&gt; &lt;span style="color:#3333ff;"&gt;in&lt;/span&gt; &lt;span style="color:#6600cc;"&gt;purchaseOrder&lt;/span&gt;.Elements("&lt;span style="color:#cc0000;"&gt;Item&lt;/span&gt;")&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;select&lt;/span&gt; (&lt;span style="color:#993399;"&gt;double&lt;/span&gt;)&lt;span style="color:#006600;"&gt;item&lt;/span&gt;.Element("&lt;span style="color:#990000;"&gt;Price&lt;/span&gt;")&lt;br /&gt;* (&lt;span style="color:#3366ff;"&gt;int&lt;/span&gt;)&lt;span style="color:#006600;"&gt;item&lt;/span&gt;.Element("&lt;span style="color:#990000;"&gt;Quantity&lt;/span&gt;")&lt;br /&gt;).Sum();&lt;br /&gt;&lt;br /&gt;Sample 2: LINQ to XSD&lt;br /&gt;&lt;br /&gt;(&lt;span style="color:#3333ff;"&gt;from&lt;/span&gt; item &lt;span style="color:#3333ff;"&gt;in&lt;/span&gt; &lt;span style="color:#990000;"&gt;purchaseOrder.Item&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;select&lt;/span&gt;&lt;span style="color:#000000;"&gt; item&lt;/span&gt;&lt;span style="color:#990000;"&gt;.Price&lt;/span&gt; * &lt;span style="color:#990000;"&gt;&lt;span style="color:#000000;"&gt;item&lt;/span&gt;.Quantity&lt;/span&gt;&lt;br /&gt;).Sum()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sample 3: XPath 2.0&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;sum&lt;/span&gt;(&lt;br /&gt;&lt;span style="color:#6600cc;"&gt;for&lt;/span&gt; $item in &lt;span style="color:#990000;"&gt;purchaseOrder/item&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#990000;"&gt;&lt;/span&gt;&lt;span style="color:#6600cc;"&gt;return&lt;/span&gt; $item/&lt;span style="color:#990000;"&gt;price&lt;/span&gt; * $item/&lt;span style="color:#990000;"&gt;quantity&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#990000;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#990000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;Now, LINQ to XSD is certainly an improvement on LINQ to XML (the latter just looks ugly to me), but is it neater than XPath 2.0. And given the similarities, why invent yet another XML expression language?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As to when LINQ to XSD is coming, there appears to be some doubt though progress is definitely being made. Scott Hanselman commented on this in a &lt;a href="http://www.hanselman.com/blog/LINQToEverythingLINQToXSDAddsMoreLINQiness.aspx"&gt;blog article&lt;/a&gt; some time ago.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-9014185571957340798?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/9014185571957340798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2008/06/linq-to-xml-xsd-and-xpath-20.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/9014185571957340798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/9014185571957340798'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2008/06/linq-to-xml-xsd-and-xpath-20.html' title='LINQ to XML / XSD and XPath 2.0'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-4003948617672675279</id><published>2008-05-01T17:38:00.002+01:00</published><updated>2008-05-01T18:21:30.072+01:00</updated><title type='text'>A Microsoft .NET XQuery Implementation: When?</title><content type='html'>To me at least, the question now seems to be 'When?' rather than 'If?'&lt;br /&gt;&lt;br /&gt;My reasoning:&lt;br /&gt;&lt;br /&gt;SQL Server 2008 will ship with what is still a cut down version of XQuery&lt;br /&gt;LINQ has already been released to much acclaim/marketing with Visual Studio 2008 / .NET 3.5&lt;br /&gt;&lt;br /&gt;With these two significant releases out of the way, there is now nothing further to hold up a full XQuery 1.0 implementation in .NET. An attempt at an earlier XQuery move that overlapped with these 2 products would have had potential to cause significant confusion, and a few headaches for the marketing guys.&lt;br /&gt;&lt;br /&gt;There are of course a number of other factors that will weigh on the decision-makers minds:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Oracle's Out-Sourcing of &lt;a href="http://xqilla.sourceforge.net/HomePage"&gt;XQuilla&lt;/a&gt;&lt;/li&gt;&lt;li&gt;The now significant number of serious 'Industrial-Strength' XQuery implementations. XQuery has achieved 'Critical-Mass'&lt;/li&gt;&lt;li&gt;Making full use of the LINQ to XML/XSD and SQL Server XQuery talent-pool while its still 'fresh'&lt;/li&gt;&lt;li&gt;.NET 3.5 is now significantly better placed for impementing incremental changes to standards through extension methods (as used by LINQ).&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This raises of course a number of follow up questions, these are just a few:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Would a .NET implementation now make much difference to the uptake of XQuery?&lt;/li&gt;&lt;li&gt;Would a .NET XSLT 2.0 implementation come at the same time?&lt;/li&gt;&lt;li&gt;Would this be too too late for Microsoft anyway, have they missed the boat?&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This is of course only a personal view, and I may well be wide of the mark. But to me the timing seems about right...&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-4003948617672675279?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/4003948617672675279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2008/05/microsoft-net-xquery-implementation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4003948617672675279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4003948617672675279'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2008/05/microsoft-net-xquery-implementation.html' title='A Microsoft .NET XQuery Implementation: When?'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-3309153803834751137</id><published>2008-04-01T19:30:00.003+01:00</published><updated>2008-04-01T20:19:18.084+01:00</updated><title type='text'>Upgrade Time</title><content type='html'>Yes, its time. Time to make that move to XPath 2.0 - I've previously mentioned the need to upgrade SketchPath from XPath 1.0, and now seems to be about right. XPath 1.0 will of course continue to be supported - and features added as required.&lt;br /&gt;&lt;br /&gt;I've decided to go for Saxon.Net as the XPath 2.0 processor for SketchPath. There are three main reasons:&lt;br /&gt;&lt;br /&gt;1. Saxon is well established as a standards compliant processor, for XPath, XSLT and XQuery&lt;br /&gt;2. A good repuation for processing Performance - especially the more highly optimised SA version&lt;br /&gt;3. Very good documentation for the Saxon.Net API, and as I'm finding now, an API that is well suited to the SketchPath task: Evaluating XPath without the benefit of a 'host' language like XSLT and XQuery.&lt;br /&gt;&lt;br /&gt;How far have I got? Well, its early days, and the first priority was to get the basic functionality in place before added more advanced features in future releases. So, the main changes to date:&lt;br /&gt;&lt;br /&gt;1. There's a new item to choose when selecting the expression engine, so you can now choose Regex, XPath 1.0 and XPath 2.0 - Also the settings pane has been extended to allow the setting of the default XPath processor.&lt;br /&gt;&lt;br /&gt;2. The results list now lists the atomic types as specified by the XPath 2.0 Data Model (XDM)&lt;br /&gt;&lt;br /&gt;3. When XPath 2.0 is selected instead of XPath 1.0, the Assist Pane is modified to reflect changes to the XPath language.&lt;br /&gt;&lt;br /&gt;3.1 The column used for the 4 pages of XPath 1.0 functions is instead used to show 4 pages of XPath operators that are grouped (loosely) according to category - A 5th page will probably be added later for XPath type operators such as 'cast as'.&lt;br /&gt;&lt;br /&gt;3.2 The Intelli-List will now list all XPath 2.0 functions alphabetically, so they can be auto-selected when typing in the expression editor. Typing 'fn:' in the XPath editor or clicking the 'fn:' column heading populates the function list ready for selection&lt;br /&gt;&lt;br /&gt;3.3 A new 'document-node' node-test has been added to the node-tests column&lt;br /&gt;&lt;br /&gt;4. The most challenging (and interesting) task so far:&lt;br /&gt;&lt;br /&gt;Modifying the built-in XPath parser that is used to colorize the expression, provide Intellisense and allow XPath expression tracing. There are many new operators to consider but the new sequence operations using for $, every $ and some $ proved especially challenging - effectively they create a localised variable whose context must be established and then maintained no matter how deeply nested within predicates or functions. Further testing on this required but early signs are good.&lt;br /&gt;&lt;br /&gt;The 'To Do' List&lt;br /&gt;Having completed an initial (successful but not published) early proof of concept for the forthcoming Schema-Aware version, I'm now reverting back to adding extra refinement to the basic features, so on the list I've got the following:&lt;br /&gt;&lt;br /&gt;1. Provide 'mouse-hover' help for each of the XPath functions&lt;br /&gt;2. Allow tabs and line-feeds to be inserted into the expression - for formatting purposes&lt;br /&gt;3. Support XPath 2.0 comments&lt;br /&gt;4. Add a 'smart' mode so that expressions are not evaluated continuously if an item is being selected from the Intelli-List&lt;br /&gt;5. Provide an auto-format feature in the XPath editor to allow nested parts to be indented on new lines&lt;br /&gt;6. Add a 'high-light matching bracket feature - expressions are getting longer and they need this feature now.&lt;br /&gt;&lt;br /&gt;Well, thats a list that should help serve as reminder to me - other requirements are associated with improving the file load performance and increasing the file-size capacity of SketchPath, 100 KB files are the current useful maximum.&lt;br /&gt;&lt;br /&gt;I will try to put in some Saxon.Net code samples here later if there's any interest shown.&lt;br /&gt;&lt;br /&gt;If you want to give it a go, the XPath 2.0 technical-preview (pre-production) version of SketchPath is now available for download from a link from the main &lt;a href="http://www.sketchpath.com/"&gt;SketchPath&lt;/a&gt; page - note that because its pre-production it is not on the main downloads page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-3309153803834751137?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/3309153803834751137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2008/04/upgrade-time.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/3309153803834751137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/3309153803834751137'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2008/04/upgrade-time.html' title='Upgrade Time'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-8491702280348332092</id><published>2008-02-24T22:14:00.002Z</published><updated>2008-02-24T22:25:29.245Z</updated><title type='text'>XPath &amp; Intellisense</title><content type='html'>The very composability of XPath makes designing a smart Intellisense feature somewhat of a challenge.&lt;br /&gt;&lt;br /&gt;How does the system know if the currently itemed type is going to be a node-name, an axis-specifier or a function? Well, the answer is, it doesn't - but I'm looking into this, so any ideas would be welcome.&lt;br /&gt;&lt;br /&gt;Currently SketchPath only dynamically populates node-names and values where the context in an XPath expression makes them legal. Other XPath constructs are available through a static grid (called the Assist Pane).&lt;br /&gt;&lt;br /&gt;Even node-names in intellisense are less than obvious. It wouldn't be that useful, for example, to wait for the full prefix to be typed before selecting the nearest name match.&lt;br /&gt;&lt;br /&gt;Anyway, this is one area I'm concentrating on in the next release of SketchPath - this should help out those users who like to keep their hands on the keyboard, rather than straying to the mouse every minute - some extra conventions for shortcuts may need to be introduced to facilitiate this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-8491702280348332092?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/8491702280348332092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2008/02/xpath-intellisense.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/8491702280348332092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/8491702280348332092'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2008/02/xpath-intellisense.html' title='XPath &amp; Intellisense'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-4843239302105209449</id><published>2007-12-20T14:14:00.000Z</published><updated>2007-12-20T14:19:13.603Z</updated><title type='text'>SketchPath Production Release</title><content type='html'>SketchPath 1.0 is now available for free download.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Update Summary&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Improved XPath Trace Logic for functions within predicates&lt;br /&gt;Settings for XML and XPath Editor font sizes now adjustable&lt;br /&gt;All configurable settings now persisted between sessions&lt;br /&gt;Improved handling of CDATA in results highlighting and when generating XPath expressions&lt;br /&gt;Expression Auto-Generation now supports Comment and Processing Instruction nodes&lt;br /&gt;XPath expressions (including 'Unfiled' expressions) saved automatically on exiting SketchPath&lt;br /&gt;'Unfiled expressions from previous session loaded automatically on launching SketchPath&lt;br /&gt;Disabled XML Save function now re-enabled&lt;br /&gt;Import XPath feature enhanced&lt;br /&gt;Command Line parameter '/l' [lowercase 'L'] can be used to set the launch XPath library&lt;br /&gt;Command Line parameter '/f' can be used to set the launch XML Instance File&lt;br /&gt;Nodes pane now supports CDATA&lt;br /&gt;Nodes pane now lists Processing Instruction and Comment Nodes&lt;br /&gt;Nodes pane 'name' column now includes position predicates where required&lt;br /&gt;TreeView Trackbar now indicates level of nesting of selected node&lt;br /&gt;Performance of XPath Import feature improved&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-4843239302105209449?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/4843239302105209449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/12/sketchpath-production-release.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4843239302105209449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4843239302105209449'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/12/sketchpath-production-release.html' title='SketchPath Production Release'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-3138596646952095025</id><published>2007-12-03T21:09:00.000Z</published><updated>2007-12-03T21:31:07.499Z</updated><title type='text'>XPath Survives Alongside Linq</title><content type='html'>With the understandable hype surrounding Linq to XML and the pushing back of XPath 2.0 it would be quite easy to believe that XPath was being sidelined within Microsoft solutions. Not so.&lt;br /&gt;&lt;br /&gt;Check out Mike Taulty's screencast - &lt;a href="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2007/12/03/9988.aspx"&gt;Linq to XML: bringing in XPath&lt;/a&gt; This shows how XPath can usefully complement Linq using System.Xml.Xpath extension methods: XpathSelectElement, XpathSelectElements, XPathEvaluate and CreateNavigator.&lt;br /&gt;&lt;br /&gt;XPath lives on...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-3138596646952095025?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/3138596646952095025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/12/xpath-survives-alongside-linq.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/3138596646952095025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/3138596646952095025'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/12/xpath-survives-alongside-linq.html' title='XPath Survives Alongside Linq'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-4414419869551574307</id><published>2007-11-11T16:17:00.000Z</published><updated>2007-11-11T16:53:06.712Z</updated><title type='text'>Microphone Shy</title><content type='html'>Hmm... Just done my first attempt at a voice commentary over a Flash demo - not brilliant, but didn't go too bad either. The 'urghh ummm...' count is rather high though, so will have to work on that.&lt;br /&gt;&lt;br /&gt;There must be some tips out there on how to do a good podcast or screencast - more research  required on my part, but in the mean time - my instincts are:&lt;br /&gt;&lt;br /&gt;1. The demo needs to be kept short - both to keep listeners interested and to keep file size to a reasonable level.&lt;br /&gt;&lt;br /&gt;2. Working to a script doesn't work unless you're a professional who knows how to make it sound natural&lt;br /&gt;&lt;br /&gt;3. The mood needs to be 'light' without overdoing it&lt;br /&gt;&lt;br /&gt;4. It would help to have another 'voice' to ask questions or to interrupt with the odd explanation&lt;br /&gt;&lt;br /&gt;For some, this must all come naturally, but for the rest of us I guess its something that takes time. If you want to hear/see my first demo its at: &lt;a href="http://pgfearo.googlepages.com/intro.html"&gt;http://pgfearo.googlepages.com/intro.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-4414419869551574307?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/4414419869551574307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/11/microphone-shy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4414419869551574307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4414419869551574307'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/11/microphone-shy.html' title='Microphone Shy'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-2621301424116476587</id><published>2007-11-10T18:52:00.000Z</published><updated>2007-11-10T19:42:43.592Z</updated><title type='text'>Why All Tools May Suck</title><content type='html'>Reading an old blog: &lt;a href="http://drmacros-xml-rants.blogspot.com/2006/02/all-tools-suck.html"&gt;All Tools Suck&lt;/a&gt; in 'Dr Macro's XML Rants' provides food for thought.&lt;br /&gt;&lt;br /&gt;In a way I can agree: All tools have some failings and are not able to meet the standards they attempt to support. In the majority of tools, edge cases are not addressed in great detail. The key question to me is really about why we use tools at all, and how good they really need to be...&lt;br /&gt;&lt;br /&gt;Using the (rather distant) analogy of our cave-dwelling ancestors and their first tools:&lt;br /&gt;In order to create their first cutting tool I guess they'd just bang one rock against another until sufficient chips came off one of them to create a sharpish edge. But this would just be the beginning, they would then be able to use the product of this to create further tools with more efficiency, these tools in turn could be used to create more specialist flints for spear heads or hand-held blades.&lt;br /&gt;&lt;br /&gt;So, the original tool (in my view) doesn't have to be perfect, so long as its better than banging two rocks together then its ok in my book. If a tool's not reliable enough or flexible enough for one purpose, then create another that is.&lt;br /&gt;&lt;br /&gt;This, along with the fact that standards are always changing and new standards created, is why there will always be room for new tools. The Swiss Army Knife approach works well to a point but the specialist stand alone (perhaps disposable) tool will always have a place too.&lt;br /&gt;&lt;br /&gt;SketchPath certainly has weaknesses, but many of these are deliberate compromises in the quest for a practical solution for a broad range or problems that could be delivered at reasonable cost (to keep the tool itself free).&lt;br /&gt;&lt;br /&gt;On standards, I can think of 3 main cases where SketchPath deviates from the XPath 1.0 standard.&lt;br /&gt;&lt;br /&gt;1. 'XPath variables' are supported.&lt;br /&gt;In the XPath core standard, variables are not supported - XSLT provides the necessary extensions for this instead. The way SketchPath implements variables, by simple macro substitution, doesn't follow the XSLT 1.0 result tree fragment/value approach but is hopefully still better than nothing for XSLT developers.&lt;br /&gt;&lt;br /&gt;2. There is some auto-conversion of XML character entities if they are used in an XPath expression - Non-standard, but a convenience feature for XSLT users&lt;br /&gt;&lt;br /&gt;3. Default Namespaces. XPath doesn't support the default namespace, but SketchPath does. This was to save end users the trouble of deleting/modifying namespace declarations, the option is also provided to use the 'def:' prefix - which is probably a better choice. Again, a 'convenience' feature which may not sit well with purists.&lt;br /&gt;&lt;br /&gt;Any chance in keeping standards fixed (before they superceded) for long enough so we can see more decent implementations?&lt;br /&gt;&lt;br /&gt;Well, this may be happening incidentally due to the 'standards democracy' that currently prevails leading to delayed standards ratification etc. Unfortunately, just the knowlege that the next version of a standard is in the pipeline is often enough to make an implementor wait.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-2621301424116476587?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/2621301424116476587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/11/why-all-tools-may-suck.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/2621301424116476587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/2621301424116476587'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/11/why-all-tools-may-suck.html' title='Why All Tools May Suck'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-4424418674531837044</id><published>2007-11-07T20:07:00.000Z</published><updated>2007-11-07T20:32:44.393Z</updated><title type='text'>Where is XPath Used?</title><content type='html'>The most popular use of XPath still has to be in systems exploiting XSLT. However, things are changing now that a number of additional formats/ standards are becoming established, here's my list:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:180%;"&gt;XPath implementations:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. XSLT (Transforms)&lt;br /&gt;2. XQuery (Data Query)&lt;br /&gt;3. XForms (User Interface - Data Binding)&lt;br /&gt;4. XAML (User Interface - Data Binding)&lt;br /&gt;5. XProc (Processing Rules - Content Management Systems)&lt;br /&gt;6. Schematron (Validation / Security)&lt;br /&gt;7. Vista Event Query Language (System Monitoring)&lt;br /&gt;8. Open XML (Word Processing / Content Binding)&lt;br /&gt;9. BizTalk Server (Orchestration Rules)&lt;br /&gt;10. Sharepoint (Form views and filters)&lt;br /&gt;11. InfoPath (Data Binding)&lt;br /&gt;12. BPEL (Superset)&lt;br /&gt;13. FPML (Financial Product Rules)&lt;br /&gt;14. W3C Schema 1.1 (Validation Rules)&lt;br /&gt;&lt;br /&gt;I'm certain there's more than this, but hopefully this illustrates how widely XPath is now used. The sector breakdown of &lt;a href="http://www.sketchpath.com/"&gt;SketchPath&lt;/a&gt; users reflect much of this diversity.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-4424418674531837044?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/4424418674531837044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/11/where-is-xpath-used.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4424418674531837044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4424418674531837044'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/11/where-is-xpath-used.html' title='Where is XPath Used?'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-8143283146026416400</id><published>2007-11-01T19:22:00.000Z</published><updated>2007-11-01T20:09:09.088Z</updated><title type='text'>XPath++ ?</title><content type='html'>I'm starting to wonder why &lt;em&gt;XPath 2.0&lt;/em&gt; is called &lt;em&gt;XPath 2.0&lt;/em&gt;, why not &lt;em&gt;XPath++&lt;/em&gt; ? I guess the intention was that everyone moved from 1.0 to 2.0. This just hasn't happened yet, and with Microsoft pushing Linq for XML it doesn't look like its going to happen soon.&lt;br /&gt;&lt;br /&gt;I know that eventually I need to provide a XPath 2.0 option for SketchPath. The trouble is, until I've actually used the new expression language, I've got no idea how to design a tool for it. I'm guessing that it wont just be enough to 'slot in' another evaluator. The UI is going to have to smarten up to deal with cool stuff like sequences (WPF might help me out here).&lt;br /&gt;&lt;br /&gt;The best thing would be if my next work project used XPath 2.0. Then, whilst I struggle to learn the many new features and the altered approach, I can be thinking: 'how would I want a tool to help me do this?'&lt;br /&gt;&lt;br /&gt;That's how SketchPath first happened. While I was learning the meaning of predicates, nodesets axes and mixed content models it was an ideal time to observe what I needed, and understand that if no one was going to do the job for me, I'd have to build the tool myself. Otherwise, I'd have built something, but it just wouldn't have ended up as SketchPath.&lt;br /&gt;&lt;br /&gt;There's a steady list of improvements and fixes for SketchPath building up, so I've got plenty to keep me going - hopefully still on course for a production release before 2008.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-8143283146026416400?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/8143283146026416400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/11/xpath.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/8143283146026416400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/8143283146026416400'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/11/xpath.html' title='XPath++ ?'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-6526536068379774914</id><published>2007-09-11T19:10:00.000+01:00</published><updated>2007-09-11T19:28:25.318+01:00</updated><title type='text'>Taking Stock</title><content type='html'>Well, the initial download rush for SketchPath has abated somewhat, so this now provides an opportunity to take stock and consider priorities to move towards that first release version.&lt;br /&gt;&lt;br /&gt;Things that need sorting:&lt;br /&gt;1. Fill in feature gaps such as:&lt;br /&gt;a. Auto-generation of XPath for comments and processing instructions&lt;br /&gt;b. Tracing through parenthesized expression blocks&lt;br /&gt;c. Population of Value Nodes pane with comments and processing instructions&lt;br /&gt;&lt;br /&gt;2. While keeping the user interface simple, provide more intuitive flexibility with positioning and orientation of panes&lt;br /&gt;&lt;br /&gt;3. Allow more control over various settings and permit these to be persisted between sessions.&lt;br /&gt;4. Fix bugs&lt;br /&gt;&lt;br /&gt;So, the list doesn't look to imposing, the main thing is to keep ambitions in rein for v1.0 this will also allow me to do a better job for the documentation and a few 'off the shelf' XPath libraries.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-6526536068379774914?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/6526536068379774914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/09/taking-stock.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/6526536068379774914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/6526536068379774914'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/09/taking-stock.html' title='Taking Stock'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-3566860666403599988</id><published>2007-09-09T11:21:00.000+01:00</published><updated>2007-09-09T11:31:40.921+01:00</updated><title type='text'>SketchPath Update</title><content type='html'>The latest release of SketchPath, 0.5.5.0 (Beta) went out today.&lt;br /&gt;&lt;br /&gt;This update is part of the continuous improvements that will happen until version 1.0 is ready, before the end of 2007.&lt;br /&gt;&lt;br /&gt;Latest enhancements:&lt;br /&gt;1. Unicode support for opening and saving XML - New Settings view allows configuration for this.&lt;br /&gt;2. In the Regular Expression mode, its now possible to switch Case Sensitivity on or off&lt;br /&gt;3. The XML text highlighter is now improved to enhance the readability of the highlighted section&lt;br /&gt;4. Double-Clicking on any part of an XPath expression now takes you directly into Trace Mode for that part.&lt;br /&gt;5. The Assist Pane has enhanced usability&lt;br /&gt;6. A number of minor bugfixes&lt;br /&gt;&lt;br /&gt;Please let me know what I can do to improve SketchPath - I've got a long list anyhow, but it would be good to prioritise this.&lt;br /&gt;&lt;br /&gt;Anyone got any good (non copyright) XPath libraries they'd like to share?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-3566860666403599988?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/3566860666403599988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/09/sketchpath-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/3566860666403599988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/3566860666403599988'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/09/sketchpath-update.html' title='SketchPath Update'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-257843182772747379</id><published>2007-09-03T22:45:00.000+01:00</published><updated>2007-09-03T23:08:54.360+01:00</updated><title type='text'>Looking Good</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_E6YrHI04IKI/RtyFUkbiv4I/AAAAAAAAAAc/BEY2Mx8rA4M/s1600-h/ap6.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5106102665954377602" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; WIDTH: 367px; CURSOR: hand; HEIGHT: 99px" height="103" alt="" src="http://3.bp.blogspot.com/_E6YrHI04IKI/RtyFUkbiv4I/AAAAAAAAAAc/BEY2Mx8rA4M/s320/ap6.png" width="590" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;Spent the last couple of weeks giving the SketchPath Assist Pane a makeover, release 0.5.4.1 went out 2nd September with this enhancement.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Things have improved so much with the usability of the Assist Pane that I was confident enough to leave it visible as the default setting. Even when 'hidden' the 'Intelli-List' is still shown, this can be such a powerful aide and it takes up minimal room alongside the results pane.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;This is probably my most preferred area of programming, looking at user interfaces and trying to make them more efficient whilst not being forced to conform to other adopted standards. Something isn't necessarily intuitive because lots of other tools use the same behaviour.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Had a bit of a breakthrough in performance issues with RichTextBox highlighting that has bothered me for some time, hopefully this will be evident in the next SketchPath release next Sunday.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Anyway for now, I've included a screenshot fragment of the latest release&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-257843182772747379?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/257843182772747379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/09/looking-good.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/257843182772747379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/257843182772747379'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/09/looking-good.html' title='Looking Good'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_E6YrHI04IKI/RtyFUkbiv4I/AAAAAAAAAAc/BEY2Mx8rA4M/s72-c/ap6.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-7583688343740402119</id><published>2007-08-23T08:51:00.000+01:00</published><updated>2007-08-23T09:11:04.018+01:00</updated><title type='text'>On the up?</title><content type='html'>In the last couple of days the SketchPath download count has seen phenomenal growth. Before Tuesday, the average daily number of downloads was about 3, on Tuesday this went up to 50 and for Wednesday this had reached the dizzy heights of 183! I imagine things will level off a bit now, but still thats not bad for a small project.&lt;br /&gt;&lt;br /&gt;This increased interest seems to be mainly due to positive comments posted by a small handful of bloggers, so my thanks to them, hopefully one day I can contribute in a similar way.&lt;br /&gt;&lt;br /&gt;There is now added impetus to improve SketchPath in this Beta stage, but also an additonal sense of responsibility, whilst not wanting to hold back some of the experimentation that has gone on with this project and helped differentiate it from other products (I'm not saying SketchPath is better here, just different).&lt;br /&gt;&lt;br /&gt;Yesterday (last night), I put in an extremely minor change to hopefully improve support for the international character set. There are still many limitations, and most of these seem to be imposed by RTF. I am now keen to investigate the use of WPF as soon as possible, this seems to be the way to go&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-7583688343740402119?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/7583688343740402119/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/08/on-up.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/7583688343740402119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/7583688343740402119'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/08/on-up.html' title='On the up?'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-4815831919241357341</id><published>2007-08-22T09:09:00.003+01:00</published><updated>2010-03-02T16:51:55.522Z</updated><title type='text'>RTF, RichTextBox .NET and Encoding</title><content type='html'>&lt;em&gt;[Update: If you're dealing with large RTF files (say 4MB), the LoadFile() method of Rich TextBox is real slow, the InkEdit control inherits from RichTextBox and is sooooo much faster. This control only works on Vista, WS2008 x86 and Windows 7, not Windows XP (unless tablet enabled), it probably also works on WS2008 R2 but I haven't yet tested this. Note: To allow the InkEdit control to function on an x64 OS, you will need to set the target platform to be x86 in the Visual Studio build settings page]&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A SketchPath user advised me recently that SketchPath has no foreign character set support. This came as a bit of a surprise because I thought I had done all the unicode / stream stuff as per the book (Obviously some more thorough testing on my part would have shown this up).&lt;br /&gt;&lt;br /&gt;It comes to light that its the RTF that SketchPath generates for the .NET richtextbox that is at fault, so I'm investigating. Below is a summary of my progress:&lt;br /&gt;&lt;br /&gt;I spent some time on this unicode/rtf issue last night, but had no real progress. This morning I found some threads on this, such as:&lt;br /&gt;&lt;a href="http://blogs.msdn.com/michkap/archive/2007/06/21/3431070.aspx"&gt;http://blogs.msdn.com/michkap/archive/2007/06/21/3431070.aspx&lt;/a&gt;&lt;br /&gt;It seems that rtf and unicode don't go together that well. I'm tempted now to put this on hold until I start using .NET 3.0/3.5 WPF controls in SketchPath, there should be much better support for unicode in these.&lt;br /&gt;&lt;br /&gt;If I start out by just replacing the RichTextBox with the WPF equivalent control but still embedded in a WinForms application that should save some time. A few months ago I did some proof of concept stuff in WPF with rich text, it seemed to work well but performance (especially scrolling) in the early betas was poor, now could be the time to look at this again.&lt;br /&gt;&lt;br /&gt;I'll have one last push this evening with rtf (I have some more ideas to try out), but if I make no real progress I'm afraid it will be delayed until I can get WPF working in SketchPath, this could take a month or so (SketchPath is a 'spare-time' activity at the moment).&lt;br /&gt;&lt;br /&gt;Now SketchPath seems to be gaining in popularity, I realise there's lot of people out there who need this, so will treat this as a priority.&lt;br /&gt;&lt;br /&gt;[Belated Update]&lt;br /&gt;The unicode problem with the RichTextBox was partially resolved some time ago. There are still RTF rendering issues though if Unicode from different character blocks in encountered.&lt;br /&gt;&lt;br /&gt;C# code similar to the following [untested] was used:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public string ConvertUnicodeForRTF(string rtfUnicode)&lt;br /&gt;{&lt;br /&gt;// Regular expression to match non-ascii characters&lt;br /&gt;Regex regNonAscii = new Regex(@"[^\x00-\x7F]");&lt;br /&gt;&lt;br /&gt;MatchCollection mc = regNonAscii.Matches(rtfUnicode);&lt;br /&gt;Match foundMatch;&lt;br /&gt;string insert;&lt;br /&gt;if (mc.Count == 0)&lt;br /&gt;{&lt;br /&gt;return rtfUnicode;&lt;br /&gt;}&lt;br /&gt;for (int i = mc.Count - 1; i &gt; -1; i--)&lt;br /&gt;{&lt;br /&gt;//start with last match&lt;br /&gt;foundMatch = mc[i];&lt;br /&gt;char c = foundMatch.Value[0];&lt;br /&gt;//remove unicode character&lt;br /&gt;int dec = Convert.ToInt32(c);&lt;br /&gt;rtfUnicode = rtfUnicode.Remove(foundMatch.Index, 1);&lt;br /&gt;insert = @"\u" + dec.ToString() + "?";&lt;br /&gt;rtfUnicode = rtfUnicode.Insert(foundMatch.Index, insert);&lt;br /&gt;}&lt;br /&gt;return rtfUnicode;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-4815831919241357341?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/4815831919241357341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/08/rtf-and-encoding.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4815831919241357341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4815831919241357341'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/08/rtf-and-encoding.html' title='RTF, RichTextBox .NET and Encoding'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-3799746712551987618</id><published>2007-08-21T12:40:00.000+01:00</published><updated>2007-08-21T12:57:38.798+01:00</updated><title type='text'>SketchPath begins to surface</title><content type='html'>My thanks must go both to &lt;a href="http://blogs.msdn.com/mikeormond/"&gt;Mike Ormand&lt;/a&gt; and &lt;a href="http://devlicious.com/blogs/derik_whittaker/default.aspx"&gt;Derik Whittaker&lt;/a&gt; who have tried out SketchPath recently and have written positive comments in their respective blogs.&lt;br /&gt;&lt;br /&gt;The number of SketchPath downloads has increased from roughly 2 per day to 42 in just the last day, so this is encouraging and gives me added motivation to continue to improve the product ready for a release 1.0 before Christmas.&lt;br /&gt;&lt;br /&gt;The most recent release (0.5.3.5), had many 'unseen' improvements to the back-end XPath debugging and also results step-through, especially for complex mixed-content cases. However the most noticable change should be useful to those struggling with large XPath expressions: SketchPath expression editor has gone multi-line!&lt;br /&gt;&lt;br /&gt;Initially I didn't see multi-line editing as a priority, wishing to promote the use of variables to break-up expressions. However, the use of increasingly high levels of nesting in XML schemas means that path locations can be extremely long, even on their own, so moving to multi-line was inevitable. There's still some way to go, because I'd like to support insertion of linefeed characters to help make expressions more readable (these currently get stripped out).&lt;br /&gt;&lt;br /&gt;Currently I'm investigating issues with RTF and Unicode that appears to be the reason for non-ASCII characters being converted to '?' characters.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-3799746712551987618?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/3799746712551987618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/08/sketchpath-begins-to-surface.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/3799746712551987618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/3799746712551987618'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/08/sketchpath-begins-to-surface.html' title='SketchPath begins to surface'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-4482511115999570029</id><published>2007-08-17T07:23:00.000+01:00</published><updated>2007-08-17T07:41:29.185+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='parser'/><category scheme='http://www.blogger.com/atom/ns#' term='xpath'/><category scheme='http://www.blogger.com/atom/ns#' term='getting started'/><category scheme='http://www.blogger.com/atom/ns#' term='cdata'/><title type='text'>The 'To Do' List</title><content type='html'>Improvements that I want/need to squeeze into SketchPath before Version 1.0 (Release before Christmas?)&lt;br /&gt;&lt;br /&gt;Full resizeable multi-line expression editing window&lt;br /&gt;XPath parser must remove line-feeds before processing, and re-insert them afterwards (in the colorized RTF output)&lt;br /&gt;More efficient import of XPath from other XML documents&lt;br /&gt;Improvement to Auto-Complete keyboard shortcuts - required for multi-line expression editing&lt;br /&gt;XPath generator should provide relative paths if the context node is set&lt;br /&gt;A quick 'proof of concept' look at improving the XML editor&lt;br /&gt;Some minor tidying up of the user interface&lt;br /&gt;Improved CDATA parsing for the element nodes pane&lt;br /&gt;Create or locate a good source XML file and associated XPath library to be used as a 'getting started' aid.&lt;br /&gt;&lt;br /&gt;So, the list doesn't look too long - I think I'll stick with this unless I get any more special requests.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-4482511115999570029?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/4482511115999570029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/08/to-do-list.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4482511115999570029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4482511115999570029'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/08/to-do-list.html' title='The &apos;To Do&apos; List'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-2712382224220489888</id><published>2007-08-13T07:55:00.000+01:00</published><updated>2007-08-13T08:24:15.048+01:00</updated><title type='text'>What's in a name?</title><content type='html'>The SketchPath project is progressing well, but fairly soon now I'm going to have to start thinking of how I label the 'post-Beta' version? Does this go out as a 'Community Technology Preview' or a 'Candidate Release' or something else?&lt;br /&gt;&lt;br /&gt;If this were a commercial concern then one of the above would probably be appropriate, however, being a small private venture makes it very tempting to go straight for the 'Version 1.0'. Most users regard any software with a '1.0' label as being untried anyway and treat it with some justified caution.&lt;br /&gt;&lt;br /&gt;The alternative is to keep SketchPath going as a Beta for some time to come, this however leads to the temptation to include new features before getting rid of all the significant bugs/annoyances, so as tempting as this may be, I shall resist and go for a 'shipped/shrink-wrapped' version as soon as possible. So the goal is 'Version 1.0' before the end of 2007!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;Debugging XPath&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;The visual XPath debugging feature has been taking up quite a bit of time recently, I feel this has been worth it as it seems to be a fairly unique feature amongst XPath tools and so could be regarded as a differentiating factor. Also, now that this has been properly combined with auto-complete it provides yet another way to build/modify XPath expressions.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;Comments and PIs&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;Whilst XPath comments and processing-instructions are fully supported for evaluating expressions and analyzing results, there is no proper XPath auto-generation for these yet, if you select such a node from the source XML. At one stage I regarded this as such an 'edge case' as to be worth ommitting. However, having looked at some Schematron scenarios where much use may be made of PIs and comments this is probably worth including.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;Relative Paths&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;This must be resolved soon. The resolution of a relative path should be simple enough, given a context path and an absolute path, also there are no significant user interface issues with this as its logical, that if you have anything other that the root node set as the context, you expect paths relative to the context node to be auto-generated.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;Namespace Manager&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;Finally, I've got around to upgrading the Namespace manager so that once you've overridden the declared prefixes in the source XML, you don't need to keep changing them each time you reload the same document or other XML documents with the same set of namespace URIs. Instead, the modified prefixes are preserved and a 'Reset' button appears which may be pressed to sync the prefixes back with the source XML. The real demand for this actually came from my own work, where I continously using prefixes that don't match those in the source XML, it started to become a real chore to keep on resetting the prefixes each time I refreshed the XML, hopefully this will help others too, in time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-2712382224220489888?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/2712382224220489888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/08/whats-in-name.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/2712382224220489888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/2712382224220489888'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/08/whats-in-name.html' title='What&apos;s in a name?'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-7609487265999724664</id><published>2007-07-05T21:07:00.000+01:00</published><updated>2007-07-05T21:26:57.003+01:00</updated><title type='text'>SketchPath Version 1.0?</title><content type='html'>Will there be a finished version of SketchPath?&lt;br /&gt;&lt;br /&gt;The answer to this depends on a number of factors. In order to get a software product sufficiently tested for a public '1.0' roll out there has to be a significant test period.&lt;br /&gt;&lt;br /&gt;The hope was that a public Beta test would assist in this, however, a month after the first Beta release, and over 100 downloads later, only a handful of responses have been received. This hardly constitutes a thorough test phase!&lt;br /&gt;&lt;br /&gt;Mindful of this, there is now some doubt about the viability of a 'stand alone' freeware XPath tool such as SketchPath. The temptation is therefore growing to discontinue public Beta development of SketchPath and instead see if a specialized version of it can be included as part of a 'business package' for contracts with selected customers. We will see what the future holds...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-7609487265999724664?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/7609487265999724664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/07/sketchpath-version-10.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/7609487265999724664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/7609487265999724664'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/07/sketchpath-version-10.html' title='SketchPath Version 1.0?'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-7901223716468239303</id><published>2007-07-05T20:58:00.000+01:00</published><updated>2007-07-05T21:04:40.399+01:00</updated><title type='text'>XPath Debugging</title><content type='html'>After having done quite a bit of work recently on the user interface parts of SketchPath, its time now to get back to basics and make sure that the XPath debugger is sufficiently enhanced.&lt;br /&gt;&lt;br /&gt;The 'Predicate-Aware' step-through debugging, could be a unique 'selling' point for SketchPath so its important that it performs to spec. Most of the predicate handling now works but now this has to be combined with stepping through XPath functions within an expression in a more useful way.&lt;br /&gt;&lt;br /&gt;The next release of SketchPath (0.4.2.0) will therefore not see significant changes to the user interface but there should be noticable improvements in the debugger, especially for expressions using funcions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-7901223716468239303?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/7901223716468239303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/07/xpath-debugging.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/7901223716468239303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/7901223716468239303'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/07/xpath-debugging.html' title='XPath Debugging'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-3940165410670566744</id><published>2007-07-02T09:09:00.000+01:00</published><updated>2007-07-02T09:29:57.897+01:00</updated><title type='text'>User Interface for Managing Grouped Items</title><content type='html'>Whilst working on the latest release of SketchPath, I had the problem of trying to provide a user interface for moving items between different groups. A tree-view was one option I considered, but because these groups are not nested, there is probably no need for this.&lt;br /&gt;&lt;br /&gt;Instead, I decided to go for the approach used by software, such as backup tools, and also interestingly, on mobile phones, where you first mark the items you want to perform an action on (in this case move them) and then you perform the action.&lt;br /&gt;&lt;br /&gt;Whilst it takes a bit of time to get used to this, I found it extremely powerful. This was especially the case when synchronising two grids of the same data. The 'master' has all columns, whilst the secondary pane has a subset of columns and is also filtered, both by a selected group name and by whether an item is marked or not.&lt;br /&gt;&lt;br /&gt;This combination of grids allows the user to view, at the same time, the other items in the group that they are about to transfer items too.&lt;br /&gt;&lt;br /&gt;A few simple action buttons, such as 'Mark Group', 'Mark All' and 'Transfer Marked Items' provide very powerful functionality. This does take some learning, but it seems to make for a more powerful and flexible way of managing grouped items that are not in a complex hierarchy.&lt;br /&gt;&lt;br /&gt;Anyway, time will tell whether this approach works, more details on this part of the user interface on the SketchPath web page for the &lt;a href="http://pgfearo.googlepages.com/expressionslibrary"&gt;XPath Expression Library.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-3940165410670566744?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/3940165410670566744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/07/user-interface-for-managing-grouped.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/3940165410670566744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/3940165410670566744'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/07/user-interface-for-managing-grouped.html' title='User Interface for Managing Grouped Items'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-1946255546539252190</id><published>2007-06-27T07:40:00.000+01:00</published><updated>2007-06-27T07:53:50.728+01:00</updated><title type='text'>First Feedback</title><content type='html'>Well, its humble beginnings but I just got my first bit of feedback for my product: SketchPath.&lt;br /&gt;&lt;br /&gt;Well, actually it was more like a support request, the 'SketchPath' install button on my website didn't work for a user. I suspect this is down to the fact that the Microsoft 'ClickOnce' setup requires Internet Explorer.&lt;br /&gt;&lt;br /&gt;The fix? Well, I've now made the installation package available as a zip file so it can be downloaded and then installed locally, rather than online.&lt;br /&gt;&lt;br /&gt;My delight at receiving an 'issue report' email, underlines how significant feedback is in the software development cycle. Its not just that its essential to ensure a product works correctly and meets user requirements, its also important to the development team (me) as a motivator to continue to improve the product as their are people out there who might actually be using it.&lt;br /&gt;&lt;br /&gt;This is probably especially true for freeware such as 'SketchPath', because there is no revenue as a motivation factor.&lt;br /&gt;&lt;br /&gt;To alleviate the feedback problem, I may actually set up a registration form, to get the bare minimum of details on users. However I'll probably have to go to a service provider for this, to ensure I'm complying with the 'Data Protection Act', so hopefully this will not incurr additional cost.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-1946255546539252190?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/1946255546539252190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/06/first-feedback.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/1946255546539252190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/1946255546539252190'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/06/first-feedback.html' title='First Feedback'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-1258224978798948906</id><published>2007-06-24T17:25:00.000+01:00</published><updated>2007-06-24T17:27:13.997+01:00</updated><title type='text'>Its Sunday so its Release Day</title><content type='html'>SketchPath 0.4.08 has just been published, check my website for further details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-1258224978798948906?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/1258224978798948906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/06/its-sunday-so-its-release-day.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/1258224978798948906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/1258224978798948906'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/06/its-sunday-so-its-release-day.html' title='Its Sunday so its Release Day'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-4254760114267347583</id><published>2007-06-23T17:16:00.000+01:00</published><updated>2007-06-23T19:13:38.318+01:00</updated><title type='text'>XML Tools</title><content type='html'>What features does the XML community really need in a tool that isn't readily available already?&lt;br /&gt;&lt;br /&gt;This is the question that probably occupies the minds of a number of software vendors, but how easy is it to answer?&lt;br /&gt;&lt;br /&gt;The thing is with XML is that its very flexibility means that no one tool can and should do everything. The key is to get the right balance, and also allow integration with other tools that specialize in other XML standards.&lt;br /&gt;&lt;br /&gt;So what XML standards/formats can be described as 'Core', which most tools should provide support for?&lt;br /&gt;&lt;br /&gt;Here's my view, in order of preference&lt;br /&gt;1. XML itself - Support for XML editing features&lt;br /&gt;2. XPath - As this is at the core of so many other standards, I'm including this second&lt;br /&gt;3?&lt;br /&gt;&lt;br /&gt;And here I struggle to complete the list. Yes, XSLT because it used both for XML data mapping purposes and for generating HTML output, but there must be many applications that use XML but don't use XSLT. So how about a Schema Definition Standard such as WXS or DTD or Relax NG or Schematron? Well, yes, but if you include one, perhaps you should include them all.&lt;br /&gt;&lt;br /&gt;Perhaps XQuery would be next. This would appeal to those using XML in a database role, however, its unlikely to appeal to web designers.&lt;br /&gt;&lt;br /&gt;How about support for some of those other key standards/formats like:&lt;br /&gt;XSL:FO, ODF, OpenXML, XPS, XForms, XAML, XUL, DocBook, SOAP, WSDL?&lt;br /&gt;&lt;br /&gt;It seems to me that this is quite a lot to take on for a single tool. What is probably needed is three types of XML tool:&lt;br /&gt;1. A generic Eclipse-like environment that comes with some built in support but where lots of plug-ins can be added to support the specific standards required.&lt;br /&gt;2. A 'Do It All' environment where everything is bundled, more or less, in a single integrated package.&lt;br /&gt;3. A specialised tool that just tries to support one function or one standard/format and do it simply, efficiently and well.&lt;br /&gt;&lt;br /&gt;All of the above approaches have merit, and there are also 'grey areas' in between these categories, but which philosophy would win through? The answer probably varies according to the individual taste/skills of those requiring a tool, as well as, the nature of the problem they're trying to solve.&lt;br /&gt;&lt;br /&gt;My instinct is that the tool most likely to survive is one that can evolve and adapt but this doesn't necessarily rule out any of the above.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-4254760114267347583?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/4254760114267347583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/06/xml-tools.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4254760114267347583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4254760114267347583'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/06/xml-tools.html' title='XML Tools'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-175504491928863273</id><published>2007-06-19T07:50:00.000+01:00</published><updated>2007-06-19T08:02:43.147+01:00</updated><title type='text'>Some Progress</title><content type='html'>The Element Nodes Pane in SketchPath is now more or less complete. The only remaining issue here is to ensure this is automatically updated as the source xml is modified.&lt;br /&gt;&lt;br /&gt;Recently I spent time on the variable substitution logic. Discovered a pretty fundamental oversight. I wasn't containing the substituted expressions in parenthesis, thus ending up with a 'broken-out' expression from &lt;span style="font-family:courier new;color:#000099;"&gt;true = $name&lt;/span&gt; to &lt;span style="font-family:courier new;color:#000099;"&gt;true() = /book = 'winnie'&lt;/span&gt;, instead of &lt;span style="font-family:courier new;color:#3333ff;"&gt;true() = (/book = 'winnie'&lt;span style="color:#000000;"&gt;), &lt;span style="font-family:georgia;"&gt;This is now fixed, but provides a good illustration on the potential pitfalls within XPath expressions.&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-175504491928863273?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/175504491928863273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/06/some-progress.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/175504491928863273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/175504491928863273'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/06/some-progress.html' title='Some Progress'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-5206728468844823234</id><published>2007-06-18T07:50:00.000+01:00</published><updated>2007-06-18T08:03:19.557+01:00</updated><title type='text'>Missed Deadline</title><content type='html'>Well, I missed my own deadline on the next SketchPath update. Most functionality is completed for the Element Nodes pane, but there are some reliability issues associated with the xml parsing to populate this, I'd rather sort these out first, so next update not till Sunday now.&lt;br /&gt;&lt;br /&gt;The good news is that the new features, especially the additional support for mixed-content are looking good. I've decided to use color instead of icons to help distinguish between different node types, there are possibly accessibility issues with this approach, but lots of tiny icons are hardly ideal either.&lt;br /&gt;&lt;br /&gt;One UI decision on the Elements Pane that I'm still grappling with is how far to go with the 'look-ahead' in the nodes pane. At the moment I'm just showing all attributes, text nodes and sub-element and their text nodes. If I go much further than this, there is a performance hit, but also its a cause of possible confusion, and it duplicates the function of the element tree view anyway.&lt;br /&gt;&lt;br /&gt;Still putting of a decision on 'medium-term' stuff. Do I go for integration with PowerShell and its XML export capability, or do I start the move towards support for XPath 2.0?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-5206728468844823234?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/5206728468844823234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/06/missed-deadline.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/5206728468844823234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/5206728468844823234'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/06/missed-deadline.html' title='Missed Deadline'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-4322663989543972171</id><published>2007-06-17T17:39:00.000+01:00</published><updated>2007-06-17T17:44:01.513+01:00</updated><title type='text'>Next Beta</title><content type='html'>I'm not sure what the protocol is for Beta releases. Currently the user base (if any) is so low that its not an issue with my weekly updates.&lt;br /&gt;&lt;br /&gt;I'm working now to finish publishing the latest release this evening. If all goes well, there will be better support for mixed content within the Element Nodes pane. I've also added a splash of color to this, to help differentiate between text nodes, attributes and sub-elements (new).&lt;br /&gt;&lt;br /&gt;If anyone's had a go with SketchPath it would be good to hear from you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-4322663989543972171?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/4322663989543972171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/06/next-beta.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4322663989543972171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/4322663989543972171'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/06/next-beta.html' title='Next Beta'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8900077986546582424.post-2905150544350388226</id><published>2007-06-15T18:51:00.000+01:00</published><updated>2007-06-16T06:02:49.201+01:00</updated><title type='text'>Another Beta Release</title><content type='html'>Early this morning (before work) I uploaded the latest beta version of SketchPath onto my site. This is actually the 4th release of the 1st Beta, but I'm hoping I'll be forgiven for brushing over this on my website.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SketchPath is the culmination of a home-project spanning (on and off) about 18 months. I'm getting to the stage now where, even though I've still a few ideas left of my own, it would be nice to test the water and find out what people out there would like in an XML tool centred on XPath.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8900077986546582424-2905150544350388226?l=sketchpath.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sketchpath.blogspot.com/feeds/2905150544350388226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sketchpath.blogspot.com/2007/06/another-beta-release.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/2905150544350388226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8900077986546582424/posts/default/2905150544350388226'/><link rel='alternate' type='text/html' href='http://sketchpath.blogspot.com/2007/06/another-beta-release.html' title='Another Beta Release'/><author><name>Phil fearon</name><uri>http://www.blogger.com/profile/17939133207748071358</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
