{"id":810,"date":"2010-04-18T22:38:48","date_gmt":"2010-04-19T05:38:48","guid":{"rendered":"https:\/\/dubinko.info\/blog\/?p=810"},"modified":"2010-04-18T22:38:48","modified_gmt":"2010-04-19T05:38:48","slug":"the-challenge-of-an-xproc-gui","status":"publish","type":"post","link":"https:\/\/dubinko.info\/blog\/2010\/04\/the-challenge-of-an-xproc-gui\/","title":{"rendered":"The challenge of an XProc GUI"},"content":{"rendered":"<p>I&#8217;ve been thinking lately about what a sleek UI for creating XProc would look like. There&#8217;s plenty of big-picture inspiration to go around, from <a href=\"http:\/\/pipes.yahoo.com\/pipes\/\">Yahoo Pipes<\/a> to Mac OSX <a href=\"http:\/\/en.wikipedia.org\/wiki\/Automator_%28software%29\">Automator<\/a>, but neither of these are as XML-focused as something working with XProc would be.<\/p>\n<p>XML, or to be really specific, XML Namespaces, comes with its own set of challenges. Making an interface that&#8217;s usable is no small task, particularly when your target audience includes the 99.9% of people that don&#8217;t completely understand namespaces. Take for example a simple step, like <a href=\"http:\/\/www.w3.org\/TR\/xproc\/#c.delete\">p:delete<\/a>.<\/p>\n<p>In brief, that step takes an XSLTMatchPattern, following the same rules as @match in XSLT, which ends up selecting various nodes from the document, then returns a document without any of those nodes. An XSLTMatchPattern has a few limitations, but it is a very general-purpose selection mechanism. In particular, it could reference an arbitrary number of XML Namespace prefix mappings. Behind a short string like a:b lies a much longer namespace URI mapping to each prefix.<\/p>\n<p>What would an intuitive user interface look like to allow entry of these kinds of expressions? How can a user keep track of unbound prefixes and attach them properly? A data-driven approach could help, say offering a menu of existing element, attribute, or namespace names taken from a pool of existing content. But by itself this falls short in 1) richer selectors, like xhtml:p[@class = &#8220;invalid&#8221;] and 2) doesn&#8217;t help in the general case, when the nodes you&#8217;re manipulating might have come from the pipeline, not your original content. (Imagine one step in the pipeline translates your XML to XHTML followed by a delete step that cleans out some unwanted nodes).<\/p>\n<p>So yeah, this seems like a Really Hard Problem, but one that&#8217;s worth taking a crack at. If this sounds like the kind of thing you&#8217;d enjoy working on, my team is hiring&#8211;drop me a note.<\/p>\n<p>-m<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;ve been thinking lately about what a sleek UI for creating XProc would look like. There&#8217;s plenty of big-picture inspiration to go around, from Yahoo Pipes to Mac OSX Automator, but neither of these are as XML-focused as something working with XProc would be. XML, or to be really specific, XML Namespaces, comes with its&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[33,4],"tags":[],"class_list":["post-810","post","type-post","status-publish","format-standard","hentry","category-annoyance","category-xml"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8eo8l-d4","_links":{"self":[{"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/posts\/810","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/comments?post=810"}],"version-history":[{"count":2,"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/posts\/810\/revisions"}],"predecessor-version":[{"id":812,"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/posts\/810\/revisions\/812"}],"wp:attachment":[{"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/media?parent=810"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/categories?post=810"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/tags?post=810"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}