Steve Saxon

About Me

Execution time: 2.831ms

Debug Tools — Trace

This is the execution flow of the page
<trace:tracexmlns:trace="uri:trace">
<trace:scripthref="/scripts/default.xsp.xml"elapsed="0.322ms">
<trace:assignname="script"value="XSP.Engine.XspScriptName"type="XspScriptName"elapsed="0.334ms"/>
<trace:assignname="scope"value="script"type="String"elapsed="0.339ms"/>
<trace:assignname="in-base"value="true"type="String"elapsed="0.439ms"/>
<trace:callhref="main"elapsed="0.474ms"script="scripts/base.xsp.xml">
<trace:callhref="pageTitle"elapsed="0.482ms"script="scripts/default.xsp.xml"/>
<trace:callhref="header"elapsed="0.488ms"script="scripts/default.xsp.xml"/>
<trace:callhref="body"elapsed="0.491ms"script="scripts/default.xsp.xml">
<trace:callhref="bodyNoNav"elapsed="0.494ms"script="scripts/base.xsp.xml">
<trace:callhref="content"elapsed="0.499ms"script="scripts/default.xsp.xml">
<trace:callhref="faqs"elapsed="0.504ms">
<trace:xmlname="randomContent"elapsed="1.879ms">
<doc:xmlxmlns:doc="uri:doc">
<answerquestion="What’s a Distinguished Engineer">
<para> It just means I’ve been doing this for a while ☺️ </para>
</answer>
<answerquestion="Why is your LinkedIn ID “xmlguy”">
<para> I was doing XML in the very early days, even before it came to be used in web services. In 1997 I was working on a few shareware Windows applications, and wanted them to exchange data. I started out with a text format based on Microsoft’s Regedit text format (similar to YAML), but it had limitations. Then I found XML, but I couldn't find any parsers, so I wrote my own. About a year later I was interviewing at Dell, and they wanted to use XML to re-do the Dell Europe website. I was the first person they’d talked to that had even heard of XML. </para>
<para> I ended up writing a scripting language called XSP where the scripts themselves were written in XML. We then used that to support Dell.com in Europe in 22 countries. XSP had an interesting content inheritance model that let you manage a large number of countries but only localizing what you wanted to. This was very popular with the business, and in 1999 we rolled it out to support the website globally in 85 countries. </para>
<para> I have an updated version of that script engine
<ahref="https://github.com/ssaxon/xsp">on my GitHub</a>
. And in the spirit of “eating your own dogfood”, this site was built with that engine. The original engine did quite a bit more, but this version is orders of magnitude faster (this page executed in
<time/>
) ... The benefit of 25 years advancement in technology (and my ability, I guess). </para>
<para> Proof:
<aonclick="showRaw()">this is the unstyled output of the page script</a>
</para>
<para> More proof:
<aonclick="showTrace()">this is the execution trace</a>
. </para>
<para> Also, did you notice what happens when you refresh the page? Just in case you didn’t think there was a script running the page 😉 </para>
<para> One fun thing about XSP ... In late 1998 I showed what I was working on to some folks at Microsoft, as I was encountering a lot of stress bugs in MSXML.DLL (the parser/XSL processor I was using at that time). They were giving each other furtive glances, and one said “is this
<i>that</i>
XSP?”. “No, he made his own!”. It turned out there was effort inside Microsoft to create their own XSP to replace Classic ASP, where they were basically adding XSL constructs to Classic ASP. We got connected, and I showed the XSP team what I was working on. I don’t know exactly what happened next, but about a month later they scrapped what they were doing, and ASP.NET was born. </para>
<para> There were quite a few similarities — the idea of creating an intermediate hierarchy of nodes, then rendering it. In XSP that was an intermediate XML document, and in ASP.NET 1.0 it was the Control hierarchy. XSP also created a hierarchical trace so you could see what it was doing, and where, and ASP.NET 1.0 had basically the same thing. </para>
<para> One thing ASP.NET 1.0 didn’t do was borrow XSP’s functional override mechanism. In XSP script support inheritance, so when you are building up a webpage, you can override a base method to change the content in a section on a page. This enables the base page to act like an overridable template. There was no easy way to do this in ASP.NET 1.0, but ASP.NET 2.0 introduced Master Pages that let you achieve the same thing. Of course, XSP had been doing that for 7 years by then! </para>
</answer>
<answerquestion="Cake or Death">
<para>Ooohh... What kind of cake is it?</para>
</answer>
<answerquestion="What programming languages do you use">
<para> In my day job I’m mostly using using
<ahref="https://kotlinlang.org">Kotlin</a>
, and some Java. I would say Kotlin is my favorite language of any I’ve used a lot — I’m impressed that they were able to make a language that was expressive enough to make you highly productive, while still making it highly readable and fun to write. </para>
<para> Prior to that it was a mix of C#, Java, and TypeScript, but I’ve also done Python and straight javascript along the way. I went back to C# to re-create XSP, and after using Kotlin I find C# really clunky. I think it’t all the semicolons, but also the lambda syntax in C#. </para>
</answer>
<answerquestion="What else have you worked on">
<para> Prior to Intuit I was working at
<b>Microsoft</b>
, where I was Chief Architect for Real-Time Communications, which is basically all the back-end chat and VoIP video and voice calling that powers Teams, and Skype. I also created something called
<ahref="https://azure.microsoft.com/en-us/products/communication-services">Azure Communication Services</a>
, which lets you add those same features in your own applications. </para>
<para> Before Microsoft I was working on Alexa at
<b>Amazon</b>
, where I led the creation of
<ahref="https://developer.amazon.com/en-US/alexa/alexa-haus/alexa-presentation-language">Alexa Presentation Language</a>
, which enables skill developers to create visuals that will show up on Alexa visual devices such as Echo Show and Alexa-enabled TVs. </para>
<para> I worked on Dell.com for 7 years during the Dot Com boom and bust, and led the site through 3 global site redesigns. The initial version for Europe was built with a scripting language I created that supported script inheritance — still a fairly unique thing. There is an updated version of that language processor on my
<ahref="https://github.com/ssaxon/xsp">GitHub</a>
I then went on to port the content publishing and rendering platform to ASP.NET with a framework internally called Storm, which was used on Dell.com for the next 14 years. </para>
<para> During the 1990s I led the creation of Renault’s showroom system, where you could pick your options and set the price update in real time. Of course now every car website has this, but this was revolutionary in 1992 before the Internet. It also let you do side-by-side finance comparisons so you could play with your options. Finally it used part of the screen to show you the margin the deal, so even though the customer was looking at the screen with you, the sales rep would always know how much wiggle room they had to offer discounts. </para>
<para> I included some videos below of things I’ve worked on. </para>
</answer>
<answerquestion="Do you speak other languages">
<para> I do ... but I’m a bit rusty. I used to be fluent in Spanish (Castilian aka. Standard Spanish), and conversational in Japanese. But along the way I’ve learned French, Welsh, Italian, Portugese, plus some Cantonese and Mandarin (which I can understand better than I can speak). </para>
<para> I’m currently doing Spanish and Japanese in Duolingo, then I’m moving on to Mandarin to improve that, and adding Hindi. I’ve found I can learn two languages at a time as long as they’re not similar. That was a mistake I made before when I was learning Spanish, Portugese, and Italian at the same time, and found I was getting the vocabulary all mixed up in my head. </para>
<para> As a computer guy, I’ve always been fascinated with the syntax and etymology of spoken languages, and how they provide a window into the mindset of different cultures. I find Japanese particularly interesting in this regard — the whole language works like LEGOs, and they have verb conjugation that would require extra words in English. For example a verb like
<i>okiru</i>
(起きる — to wake up), but if you conjugate with
<i>-nikui</i>
(にくい — “hard to
<i>do something</i>
”), you get
<i>okinikui</i>
(起きにくい — “(it is) hard to wake up”. Such an interesting language. Japanese also adapts words for “sound convenience” (to make words easier to say), which is also a big thing in Welsh. I’m such a nerd. </para>
</answer>
<answerquestion="What kind of music do you listen to">
<para> My Spotify is all over the place, from Death Metal (Opeth, Lamb of God), to 80s/90s J-Pop (Yuming, Imai Maki, Anri, Speed, Chemistry), and more recently to Taylor Swift, and classic jazz. </para>
<para> I was into hardcode rap (e.g. DMX, Ruff Ryders), but when Office Space came out, I realized I was the Michael Bolton character, and I pivoted. </para>
</answer>
<answerquestion="What is your defining quality as a software engineer">
<para> I am a builder — I always have been. I find a problem, and I don’t rest until I have an elegant solution. Elegant can take many forms, but for me it often means creating frameworks that make it easy to do something that was previously hard. Often times that takes the form of creating domain-specific languages that make it easy to get results without writing a ton of code. </para>
<para> When I was at Amazon, they use their Leadership Principles to define what they think your “superpowers” are, and for me it was Think Big. A lot of times I’m living a year in the future, thinking about problems the team doesn’t even know it has yet, which gives me time to help them avoid pitfalls. But it also means I have to spend time explaining things that don’t always seem obvious to the rest of the team. </para>
<para> I also used to tell people that my personal motto was “if you see me running, try and keep up!”, but over time I’ve come to understand there’s no point running if you’re not following me. Maybe I’ve mellowed! </para>
</answer>
<answerquestion="Where do you live">
<para> I live in Southern California now, out near Palm Springs, but I am originally from the UK. I was actually born in West London, very close to where Ted Lasso is set. I’ve also spent quite a few years in North Wales (in the UK), Texas, Arizona, and Washington (State), so my accent is wonky. </para>
</answer>
</doc:xml>
</trace:xml>
<trace:assignname="randomSet"value="764961914 619582092 798882129 1943077368 1314209635 744778421 439148466 1629457157 884144223 215183625 537691380 1932092805 409976025 37259938 1394819539 1171156240 1648366105 1406081160 204112484 166483342"type="String"elapsed="1.959ms"/>
<trace:callhref="indices"elapsed="1.975ms"/>
<trace:xmlname="indices"elapsed="2.236ms">
<doc:xmlxmlns:doc="uri:doc">
<index>3</index>
<index>7</index>
<index>1</index>
<index>4</index>
<index>8</index>
<index>9</index>
<index>1</index>
<index>3</index>
<index>1</index>
<index>7</index>
<index>7</index>
<index>4</index>
<index>7</index>
<index>2</index>
<index>8</index>
<index>2</index>
<index>5</index>
<index>1</index>
<index>9</index>
<index>2</index>
</doc:xml>
</trace:xml>
<trace:xmlname="unique_indices"elapsed="2.351ms">
<doc:xmlxmlns:doc="uri:doc">
<index>3</index>
<index>7</index>
<index>1</index>
<index>4</index>
<index>8</index>
<index>9</index>
<index>2</index>
<index>5</index>
</doc:xml>
</trace:xml>
<trace:xmlname="grouped"elapsed="2.480ms">
<doc:xmlxmlns:doc="uri:doc">
<indexxmlns:doc="uri:doc">3</index>
<indexxmlns:doc="uri:doc">7</index>
<indexxmlns:doc="uri:doc">1</index>
<indexxmlns:doc="uri:doc">4</index>
<answerquestion="What’s a Distinguished Engineer">
<para> It just means I’ve been doing this for a while ☺️ </para>
</answer>
<answerquestion="Why is your LinkedIn ID “xmlguy”">
<para> I was doing XML in the very early days, even before it came to be used in web services. In 1997 I was working on a few shareware Windows applications, and wanted them to exchange data. I started out with a text format based on Microsoft’s Regedit text format (similar to YAML), but it had limitations. Then I found XML, but I couldn't find any parsers, so I wrote my own. About a year later I was interviewing at Dell, and they wanted to use XML to re-do the Dell Europe website. I was the first person they’d talked to that had even heard of XML. </para>
<para> I ended up writing a scripting language called XSP where the scripts themselves were written in XML. We then used that to support Dell.com in Europe in 22 countries. XSP had an interesting content inheritance model that let you manage a large number of countries but only localizing what you wanted to. This was very popular with the business, and in 1999 we rolled it out to support the website globally in 85 countries. </para>
<para> I have an updated version of that script engine
<ahref="https://github.com/ssaxon/xsp">on my GitHub</a>
. And in the spirit of “eating your own dogfood”, this site was built with that engine. The original engine did quite a bit more, but this version is orders of magnitude faster (this page executed in
<time/>
) ... The benefit of 25 years advancement in technology (and my ability, I guess). </para>
<para> Proof:
<aonclick="showRaw()">this is the unstyled output of the page script</a>
</para>
<para> More proof:
<aonclick="showTrace()">this is the execution trace</a>
. </para>
<para> Also, did you notice what happens when you refresh the page? Just in case you didn’t think there was a script running the page 😉 </para>
<para> One fun thing about XSP ... In late 1998 I showed what I was working on to some folks at Microsoft, as I was encountering a lot of stress bugs in MSXML.DLL (the parser/XSL processor I was using at that time). They were giving each other furtive glances, and one said “is this
<i>that</i>
XSP?”. “No, he made his own!”. It turned out there was effort inside Microsoft to create their own XSP to replace Classic ASP, where they were basically adding XSL constructs to Classic ASP. We got connected, and I showed the XSP team what I was working on. I don’t know exactly what happened next, but about a month later they scrapped what they were doing, and ASP.NET was born. </para>
<para> There were quite a few similarities — the idea of creating an intermediate hierarchy of nodes, then rendering it. In XSP that was an intermediate XML document, and in ASP.NET 1.0 it was the Control hierarchy. XSP also created a hierarchical trace so you could see what it was doing, and where, and ASP.NET 1.0 had basically the same thing. </para>
<para> One thing ASP.NET 1.0 didn’t do was borrow XSP’s functional override mechanism. In XSP script support inheritance, so when you are building up a webpage, you can override a base method to change the content in a section on a page. This enables the base page to act like an overridable template. There was no easy way to do this in ASP.NET 1.0, but ASP.NET 2.0 introduced Master Pages that let you achieve the same thing. Of course, XSP had been doing that for 7 years by then! </para>
</answer>
<answerquestion="Cake or Death">
<para>Ooohh... What kind of cake is it?</para>
</answer>
<answerquestion="What programming languages do you use">
<para> In my day job I’m mostly using using
<ahref="https://kotlinlang.org">Kotlin</a>
, and some Java. I would say Kotlin is my favorite language of any I’ve used a lot — I’m impressed that they were able to make a language that was expressive enough to make you highly productive, while still making it highly readable and fun to write. </para>
<para> Prior to that it was a mix of C#, Java, and TypeScript, but I’ve also done Python and straight javascript along the way. I went back to C# to re-create XSP, and after using Kotlin I find C# really clunky. I think it’t all the semicolons, but also the lambda syntax in C#. </para>
</answer>
<answerquestion="What else have you worked on">
<para> Prior to Intuit I was working at
<b>Microsoft</b>
, where I was Chief Architect for Real-Time Communications, which is basically all the back-end chat and VoIP video and voice calling that powers Teams, and Skype. I also created something called
<ahref="https://azure.microsoft.com/en-us/products/communication-services">Azure Communication Services</a>
, which lets you add those same features in your own applications. </para>
<para> Before Microsoft I was working on Alexa at
<b>Amazon</b>
, where I led the creation of
<ahref="https://developer.amazon.com/en-US/alexa/alexa-haus/alexa-presentation-language">Alexa Presentation Language</a>
, which enables skill developers to create visuals that will show up on Alexa visual devices such as Echo Show and Alexa-enabled TVs. </para>
<para> I worked on Dell.com for 7 years during the Dot Com boom and bust, and led the site through 3 global site redesigns. The initial version for Europe was built with a scripting language I created that supported script inheritance — still a fairly unique thing. There is an updated version of that language processor on my
<ahref="https://github.com/ssaxon/xsp">GitHub</a>
I then went on to port the content publishing and rendering platform to ASP.NET with a framework internally called Storm, which was used on Dell.com for the next 14 years. </para>
<para> During the 1990s I led the creation of Renault’s showroom system, where you could pick your options and set the price update in real time. Of course now every car website has this, but this was revolutionary in 1992 before the Internet. It also let you do side-by-side finance comparisons so you could play with your options. Finally it used part of the screen to show you the margin the deal, so even though the customer was looking at the screen with you, the sales rep would always know how much wiggle room they had to offer discounts. </para>
<para> I included some videos below of things I’ve worked on. </para>
</answer>
<answerquestion="Do you speak other languages">
<para> I do ... but I’m a bit rusty. I used to be fluent in Spanish (Castilian aka. Standard Spanish), and conversational in Japanese. But along the way I’ve learned French, Welsh, Italian, Portugese, plus some Cantonese and Mandarin (which I can understand better than I can speak). </para>
<para> I’m currently doing Spanish and Japanese in Duolingo, then I’m moving on to Mandarin to improve that, and adding Hindi. I’ve found I can learn two languages at a time as long as they’re not similar. That was a mistake I made before when I was learning Spanish, Portugese, and Italian at the same time, and found I was getting the vocabulary all mixed up in my head. </para>
<para> As a computer guy, I’ve always been fascinated with the syntax and etymology of spoken languages, and how they provide a window into the mindset of different cultures. I find Japanese particularly interesting in this regard — the whole language works like LEGOs, and they have verb conjugation that would require extra words in English. For example a verb like
<i>okiru</i>
(起きる — to wake up), but if you conjugate with
<i>-nikui</i>
(にくい — “hard to
<i>do something</i>
”), you get
<i>okinikui</i>
(起きにくい — “(it is) hard to wake up”. Such an interesting language. Japanese also adapts words for “sound convenience” (to make words easier to say), which is also a big thing in Welsh. I’m such a nerd. </para>
</answer>
<answerquestion="What kind of music do you listen to">
<para> My Spotify is all over the place, from Death Metal (Opeth, Lamb of God), to 80s/90s J-Pop (Yuming, Imai Maki, Anri, Speed, Chemistry), and more recently to Taylor Swift, and classic jazz. </para>
<para> I was into hardcode rap (e.g. DMX, Ruff Ryders), but when Office Space came out, I realized I was the Michael Bolton character, and I pivoted. </para>
</answer>
<answerquestion="What is your defining quality as a software engineer">
<para> I am a builder — I always have been. I find a problem, and I don’t rest until I have an elegant solution. Elegant can take many forms, but for me it often means creating frameworks that make it easy to do something that was previously hard. Often times that takes the form of creating domain-specific languages that make it easy to get results without writing a ton of code. </para>
<para> When I was at Amazon, they use their Leadership Principles to define what they think your “superpowers” are, and for me it was Think Big. A lot of times I’m living a year in the future, thinking about problems the team doesn’t even know it has yet, which gives me time to help them avoid pitfalls. But it also means I have to spend time explaining things that don’t always seem obvious to the rest of the team. </para>
<para> I also used to tell people that my personal motto was “if you see me running, try and keep up!”, but over time I’ve come to understand there’s no point running if you’re not following me. Maybe I’ve mellowed! </para>
</answer>
<answerquestion="Where do you live">
<para> I live in Southern California now, out near Palm Springs, but I am originally from the UK. I was actually born in West London, very close to where Ted Lasso is set. I’ve also spent quite a few years in North Wales (in the UK), Texas, Arizona, and Washington (State), so my accent is wonky. </para>
</answer>
</doc:xml>
</trace:xml>
</trace:call>
</trace:call>
</trace:call>
</trace:call>
<trace:callhref="footer"elapsed="2.809ms">
<trace:callhref="debugLinks"elapsed="2.818ms"script="scripts/default.xsp.xml"/>
</trace:call>
</trace:call>
</trace:script>
</trace:trace>

Debug Tools — Content

This is the content of this page before styling
<doc:rootxmlns:doc="uri:doc"executionMs="2.831"xsltRenderMs="67.474">
<doc:title>Steve Saxon</doc:title>
<doc:body>
<doc:content>
<doc:bannerImage>/img_2905.jpg</doc:bannerImage>
<doc:faq>
<doc:answerquestion="Who are you">
<doc:para> Hi, I’m Steve. I’m a Distinguished Engineer at Intuit, working on QuickBooks, with a focus on Developer Velocity and AI, distributed systems architecture, and creating frameworks to make developer’s lives easier. </doc:para>
</doc:answer>
<doc:answerquestion="Cake or Death"xmlns:doc="uri:doc">
<doc:para>Ooohh... What kind of cake is it?</doc:para>
</doc:answer>
<doc:answerquestion="What kind of music do you listen to"xmlns:doc="uri:doc">
<doc:para> My Spotify is all over the place, from Death Metal (Opeth, Lamb of God), to 80s/90s J-Pop (Yuming, Imai Maki, Anri, Speed, Chemistry), and more recently to Taylor Swift, and classic jazz. </doc:para>
<doc:para> I was into hardcode rap (e.g. DMX, Ruff Ryders), but when Office Space came out, I realized I was the Michael Bolton character, and I pivoted. </doc:para>
</doc:answer>
<doc:answerquestion="What’s a Distinguished Engineer"xmlns:doc="uri:doc">
<doc:para> It just means I’ve been doing this for a while ☺️ </doc:para>
</doc:answer>
<doc:answerquestion="What programming languages do you use"xmlns:doc="uri:doc">
<doc:para> In my day job I’m mostly using using
<ahref="https://kotlinlang.org">Kotlin</a>
, and some Java. I would say Kotlin is my favorite language of any I’ve used a lot — I’m impressed that they were able to make a language that was expressive enough to make you highly productive, while still making it highly readable and fun to write. </doc:para>
<doc:para> Prior to that it was a mix of C#, Java, and TypeScript, but I’ve also done Python and straight javascript along the way. I went back to C# to re-create XSP, and after using Kotlin I find C# really clunky. I think it’t all the semicolons, but also the lambda syntax in C#. </doc:para>
</doc:answer>
</doc:faq>
<doc:youtubetitle="Gallery">
<videoid="OiODId_I9c4">Intuit Assist in QuickBooks</video>
<videoid="SA8iqgN2rC4">QuickBooks Commerce Accounting</video>
<videoid="OiODId_I9c4">Intuit Global Engineering Days</video>
<videoid="chMHVHLFcao">Introduction to Azure Communication Services</video>
<videoid="yaZJy0MLrUw">Zero to Hero, Part 8: Alexa Presentation Language (APL), Part 1</video>
<videoid="vV_0QDdXCng">Microsoft Teams architecture update - BRK3118</video>
</doc:youtube>
<doc:resumepdf="steve-saxon.pdf">
<doc:page>resume-1.svg</doc:page>
<doc:page>resume-2.svg</doc:page>
</doc:resume>
</doc:content>
</doc:body>
<doc:footer>
<doc:footerLinkhref="https://www.linkedin.com/in/xmlguy/">Linked In</doc:footerLink>
<doc:footerLinkclick="showResume()">Full Bio</doc:footerLink>
<doc:debugLinks>
<linkid="trace"block="#TRC#"title="Trace"intro="This is the execution flow of the page"/>
<linkid="raw"block="#RAW#"title="Content"intro="This is the content of this page before styling"/>
<linkid="scr"block="#SCR#"title="Page Script"intro="This is the default.xsp.xml script that rendered this page"/>
<linkid="base"block="#BASE#"title="Base Script"intro="This is the base.xsp.xml script the page script inherited from"/>
</doc:debugLinks>
</doc:footer>
</doc:root>

Debug Tools — Page Script

This is the default.xsp.xml script that rendered this page
<xsp:scriptbase="base.xsp.xml"xmlns:xsp="uri:xsp"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns:doc="uri:doc">
<xsp:assignname="scope"value="script"/>
<xsp:subname="pageTitle">Steve Saxon</xsp:sub>
<xsp:subname="body">
<xsp:callhref="#bodyNoNav"/>
</xsp:sub>
<xsp:subname="header"/>
<xsp:subname="content">
<doc:bannerImage>/img_2905.jpg</doc:bannerImage>
<doc:faq>
<xsp:callhref="#faqs"/>
</doc:faq>
<doc:youtubetitle="Gallery">
<xsp:querysrc="/data/youtube.xml"select="//video"/>
</doc:youtube>
<doc:resumepdf="steve-saxon.pdf">
<doc:page>resume-1.svg</doc:page>
<doc:page>resume-2.svg</doc:page>
</doc:resume>
</xsp:sub>
<xsp:subname="faqs">
<doc:answerquestion="Who are you">
<doc:para> Hi, I’m Steve. I’m a Distinguished Engineer at Intuit, working on QuickBooks, with a focus on Developer Velocity and AI, distributed systems architecture, and creating frameworks to make developer’s lives easier. </doc:para>
</doc:answer>
<xsp:xmlname="grouped">
<xsp:xmlname="randomContent"cacheKey="randomContent"cacheDuration="00:10:00">
<xsp:querysrc="/data/answers/*.xml"select="/*/*/answer"/>
</xsp:xml>
<xsp:xmlname="unique_indices">
<xsp:xmlname="indices">
<xsp:assignname="randomSet"value="${random(20)}"/>
<xsp:querysrc="#randomContent"args="randomSet">
<xsp:callhref="#indices"/>
</xsp:query>
</xsp:xml>
<xsp:querysrc="#indices">
<xsl:templatematch="/">
<xsl:for-eachselect="/*/index[not(.=preceding::*)]">
<index>
<xsl:value-ofselect="."/>
</index>
</xsl:for-each>
</xsl:template>
</xsp:query>
</xsp:xml>
<xsp:querysrc="#unique_indices">
<xsl:templatematch="/">
<xsl:copy-ofselect="/*/index[position() <= 4]"/>
</xsl:template>
</xsp:query>
<xsp:querysrc="#randomContent"/>
</xsp:xml>
<xsp:querysrc="#grouped">
<xsl:templatematch="/">
<xsl:for-eachselect="/*/index">
<xsl:apply-templatesselect="/*/answer[position() = current()]"/>
</xsl:for-each>
</xsl:template>
<xsl:templatematch="answer">
<doc:answer>
<xsl:attributename="question">
<xsl:value-ofselect="@question"/>
</xsl:attribute>
<xsl:apply-templates/>
</doc:answer>
</xsl:template>
<xsl:templatematch="para">
<doc:para>
<xsl:apply-templates/>
</doc:para>
</xsl:template>
<xsl:templatematch="a|b|i|time">
<xsl:copy-ofselect="current()"/>
</xsl:template>
</xsp:query>
</xsp:sub>
<xsp:subname="indices">
<xsl:paramname="randomSet"/>
<xsl:variablename="c">
<xsl:value-ofselect="count(/*/answer)"/>
</xsl:variable>
<xsl:templatematch="/">
<xsl:call-templatename="split">
<xsl:with-paramname="pText"select="$randomSet"/>
</xsl:call-template>
</xsl:template>
<xsl:templatename="split">
<xsl:paramname="pText"/>
<xsl:choose>
<xsl:whentest="string-length($pText) = 0"/>
<xsl:whentest="contains($pText, ' ')">
<index>
<xsl:value-ofselect="(substring-before($pText, ' ') mod $c) + 1"/>
</index>
<xsl:call-templatename="split">
<xsl:with-paramname="pText"select="substring-after($pText, ' ')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<index>
<xsl:value-ofselect="($pText mod $c) + 1"/>
</index>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsp:sub>
<xsp:subname="debugLinks">
<doc:debugLinks>
<linkid="trace"block="#TRC#"title="Trace"intro="This is the execution flow of the page"/>
<linkid="raw"block="#RAW#"title="Content"intro="This is the content of this page before styling"/>
<linkid="scr"block="#SCR#"title="Page Script"intro="This is the default.xsp.xml script that rendered this page"/>
<linkid="base"block="#BASE#"title="Base Script"intro="This is the base.xsp.xml script the page script inherited from"/>
</doc:debugLinks>
</xsp:sub>
</xsp:script>

Debug Tools — Base Script

This is the base.xsp.xml script the page script inherited from
<xsp:scriptxmlns:xsp="uri:xsp"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns:doc="uri:doc">
<xsp:assignname="in-base"value="true"/>
<xsp:subname="main">
<doc:title>
<xsp:callhref="#pageTitle"/>
</doc:title>
<xsp:callhref="#header"/>
<xsp:callhref="#body"/>
<xsp:callhref="#footer"/>
</xsp:sub>
<xsp:subname="pageTitle">Steve Saxon</xsp:sub>
<xsp:subname="header">
<doc:header/>
</xsp:sub>
<xsp:subname="body">
<doc:body>
<doc:leftnav>
<xsp:callhref="#leftnav"/>
</doc:leftnav>
<doc:content>
<xsp:callhref="#content"/>
</doc:content>
</doc:body>
</xsp:sub>
<xsp:subname="bodyNoNav">
<doc:body>
<doc:content>
<xsp:callhref="#content"/>
</doc:content>
</doc:body>
</xsp:sub>
<xsp:subname="leftnav">
</xsp:sub>
<xsp:subname="content">
</xsp:sub>
<xsp:subname="footer">
<doc:footer>
<doc:footerLinkhref="https://www.linkedin.com/in/xmlguy/">Linked In</doc:footerLink>
<doc:footerLinkclick="showResume()">Full Bio</doc:footerLink>
<xsp:callhref="#debugLinks"/>
</doc:footer>
</xsp:sub>
<xsp:subname="debugLinks"/>
<xsp:subname="implementedInBase">
<implementedInBase>
<xsp:callhref="#withOverride?style=implicit"/>
</implementedInBase>
</xsp:sub>
<xsp:subname="withOverride">
<withOverridestyle="${style}"file="${script.shortName}">base</withOverride>
</xsp:sub>
</xsp:script>