Domestic and Sexual Abuse amid the COVID-19 Crisis

Congressional candidate Vangie Williams, Evelyn BruMar, Susheela Varky, our next Governor, Jennifer Carroll Foy, and my dear friend and survivor Lisa Sales all hosted a special panel yesterday on Domestic and Sexual Violence. I was not able to attend live but this issue is very dear to me, and I wanted to share it with my readers.

Family Violence & Sexual Assault
If you need help in the commonwealth, please 1-800-838-8238. It’s Free, Confidential, and available 24/7

If you can, please open up your hearts and help the women (and men) who are in danger. Check in with your loved ones, your friends, anyone you think needs to hear from you.

And please watch their conversation to help you stay safe, and how to get help. You’re not alone.

Domestic and Sexual Abuse amid the COVID-19 Crisis

This is a Zoom Panel Discussion regarding “Domestic and Sexual Abuse amid the COVID-19 Crisis.”

Posted by Vangie Williams for Congress on Friday, April 24, 2020

Great panel, my friends, let’s get the Domestic Abuse Czar, and happy to help with the app Lisa!

Be safe my lady and gentlemen friends!

DashCam Fail Code

TeslaCam, Tesla Can’t, 2.0

I really wanted to have my DashCam fixed by today. I really did. But then the hypochondriac got involved, called Tesla, and have them tell me some least common denominator information information that they wouldn’t accept there was a problem with my Tesla unless I tested it with a USB Key [sic]. As I didn’t have any USB Sticks handy, I ordered one that was Tesla branded, as well as a faster, High Endurance MicroSD Card and new adaptor.

The USB Stick won’t arrive until later in the week but the flimsy excuse from the hypochondriac threatened to call the police if I didn’t cancel my service request and wait for my USB Stick order to arrive. She said some lawn care folks would be here today but of course they didn’t come, so I ended up cancelling my appointment for nothing.

However, not wanting to give up, I got my MicroSD Card and tried it in #CO2Fre. It was formatted as exFAT so I formatted it as FAT32 and plugged it into #CO2Fre. Nothing.

I did some more research and realized that most drives come formatted with an MBR to allocate its partitions. I pulled the SanDisk Extreme SDD #CO2Fre and it too had an MBR. Since Tesla recommends using a GUID Partition Table, I opened up DiskUtility and reformatted the entire drive with a GUID Partition Table and a FAT32 File System.

GUID Drive
This is what DiskUtility shows for the SanDisk Extreme SDD 2TB Drive. Under the heading, you can clearly see the drive is formatted as a GUID Partition Map, as requested by Tesla

This went quickly and in the end I had the system correctly formatted as per Tesla’s specifications. The drive was formatted with 2TB of free space.

FAT32 Partition
This is what DiskUtility shows for the one partition on my SanDisk. The Partition is called TESLACAM as FAT32 only supports uppercase names. Below that, you can see the format is indeed FAT32, as requested by Tesla

Finally, I added the TeslaCam folder.

Drive Contains TeslaCam Folder
This is the root folder of the SanDisk drive. You can clearly see a TeslaCam folder in the root, as required by Tesla

With the drive reconfigured to Tesla’s specifications, I donned the rubber gloves and tried the SanDisk SDD in #CO2Fre. Finally, I got a camera in the toolbar. Only there was an X on the Camera and a warning label. When I clicked the warning, #CO2Fre gave me a mysterious UI_a078 error,

DashCam Fail Code
Despite doing everything right, using an externally verified SanDisk Extreme SDD with a GUID Partition Map and a FAT32 filesystem with a TeslaCam folder, this is what #CO2Fre tells me. I was unable to verify what the UI_a078 message means and more conversations with Tesla recommend I schedule another appointment

Because the hypochondriac doesn’t want them to come to my house to fix #CO2Fre, she insisted I call Tesla’s tech support. I reiterated the issue to the support staff, including the note about UI_a078, and told him about my problems obtaining a USB Stick, and he recommended I make a new appointment as the Tesla Mobile Team Member would have a USB Stick he or she could use to test the USB ports of #CO2Fre.

Of course, the hypochondriac vetoed this idea and instead she ordered a couple, cheap USB Stick that should get here by Sunday. If they don’t work, I may be able to get support to come out next week to help me finally resolve this most vexing issue.

Alas, until then, I won’t be cruising on the cloud.

Let the People Pick the President

The Case for Abolishing the Electoral College

Today, my good friend Eileen Reavey hosted a chat with Jesse Wegman, author of the new book Let the People Pick the President on Zoom and the official Facebook page (as opposed to my Grassroots page). Jesse layed out the reasons why we have the Electoral College and how states choosing how to interpret Article II, Section 1, Paragraph 2, as Amended hasn’t always been Winner-Take-All.

Jesse goes on to point out how Compacts only need Congressional Review when they violate Federal Supremacy. This is one of the major arguments we face when defending the NPVIC. Along with the misconception that in most states where are not battlegrounds, your vote doesn’t count now, so under the compact you aren’t decreasing the power of your state, you’re increasing the power of your state’s voters.

Another good point is how non-partisan this issue is. When you put all your eggs in one proverbial basket of battleground states, you end up with a system that more subject to the whim rather than reflecting the will of the nation as a whole. We know, for example, that voter turnout for President is up to 11% higher in battleground states than it is in non-battleground states.

Finally, we touched on the tangential issue of Ranked Choice Voting. The thing that folks don’t understand is any issue with the Spoiler Effect inherent in the NPVIC exists in the Electoral College as well. The NPIC isn’t trying to remedy that issue and that issue is much better approached by promoting Ranked Choice Voting as well as the National Popular Vote Interstate Compact for the reasons Jesse so eloquently outlines.

Webinar with Jesse Wegman

Webinar with Jesse Wegman and Eileen Reavey

Posted by National Popular Vote on Thursday, April 23, 2020

I greatly admire Jesse for making the effort to write a wonderful book and to take the time to speak with Eileen. He and I may disagree on how best to end Gerrymandering in Virginia, but I’ll save that argument for another day. Right now, let’s work together to ensure One Person, One Vote where Every Vote is Equal. Ask your state governments to pass the NPVIC today.

Happy 50 Years of Earth Day

Today we celebrate fifty years of our beloved planet Earth; it’s Earth Day. Many celebrations are occuring today to celebrate half a century of environmental movements and cherishing a planet we’ve taken for granted in our 100,000 years of evolution. Even the Sierra Club is celebrating in tandem with the the Electric Auto Association and Plug-In America with a live Facebook event earlier today.

Now, as you may remember, I was giving a demonstration of #CO2Fre on Saturday with Drive Electric RVA. Unfortunately, we didn’t even get a dozen folks to watch #CO2Fre go from 0–70 practically in the blink of an eye and show you all the cool features of my ride—sans Summon or my DashCam.

Happy Earth Day, y’all and hope someday soon you can cruise upon a cloud with me in person!

Meet Virginia’s next Governor!

I was delighted to see Delegate Jennifer Carroll Foy at today’s Herndon-Reston Indivisible meeting on Zoom. I first met Delegate Carroll Foy during my many years of trips to Richmond to lobby for the ERA. And Jennifer has been one of the best advocates we’ve had in the General Assembly. She has been a wonderful orator who gave an incredible speech in favor of the ERA last year as we were fighting for the ERA. And in the 2020 session of the General Assembly, it was Jennifer who submitted HJR 1, the ERA bill.

I was, of course, there on 27 January 2020 when Jennifer held a press conference announcing that would be the day both chambers of the General Assembly would be voting on the legislation passed by the other chamber and thus ratify the ERA in Virginia, making us 38 and the last state needed for passage.

Delegate Jennifer Carroll Foy
Here I am with Jennifer Carroll Foy on 27 January, 2020, the day we—finally—passed the ERA! This was just before her press conference to announce that both chambers of the General Assembly would be voting on the other chamber’s resolution and it was a race to see who would pass it first. I was confused and didn’t get to the gallery in time (which is why I’m not in the photo on the stairs), but a bunch of us watched the House of Delegates debate and when I went out to powder my nose, I peeked in on the Senate and saw they were debating Jennifer Carroll Foy’s HJR 1. We did it, my friend!

Unfortunately, after the press conference, I got a little lost so wasn’t able to make it to our amazing photo on the stairs that day. Instead, I made my way to the House and Senate conference rooms where the General Assembly was being broadcast. I joined some of my fellow ERA advocates in the House Meeting Room 3. The House of Delegates was busy debating a number of bills and eventually I needed to use the facilities.

On my way back, I peeked in in the Virginia Senate in Senate Meeting Room 3. They were debating Jennifer’s HJR 1! I rushed back to the House Meeting Room and let everyone know it was happening in the Senate. We all rushed over and watched it live, as it happened. As Virginia became the 38th and final state to pass the ERA. We did it! We made history! And, all thanks to Jennifer’s HJR1!

As my readers know, I have long advocated for the adoption of the Equal Rights Amendment, but I am happy to hear Jennifer supports many of the other issues I care deeply about. That is why, without hesitation, I am happy to support Jennifer as she announces her bid to become the next Governor of Virginia!

Be well my lady and gentlemen friends!

TeslaCam, Tesla Can’t

I haven’t been able to use the TeslaCam since 27 July 2019. That’s because, around TeslaOS 2019.28.1, Tesla broke most USB Sticks used for Dashcam functionality, because, it claimed, they were too slow.

Not having a DashCam and having such a mysterious and incomprehensible error—my USB stick was fast enough—I was afraid to buy a new USB stick to see if I could get it working again. For months I dithered on the issue, totally unsure what Tesla wanted, and wanting so badly not to waste money on a device that would fail with Tesla.

Compound that with, in December, 2019, thanks to an AutoPilot, #CO2Fre failed to stop when a vehicle with California plates cut me off by jumping into the exit lane ahead of me at the last minute, causing $4,000 worth of damage I can’t remotely afford to pay. The scratches, therefore, remain to this day. And as no solace, I don’t even have the Dashcam video to go over the details even if I wanted to make an Insurance claim. So, I have scratches but still no Dashcam.

Then TeslaOS 2020.12.5 came out, which added support for watching Dashcam videos within #CO2Fre. Since I had the time off thanks to Covidapolis, I decided to try again with the Dashcam, and found this neat video:

Thanks to that video I decided to buy a 2TB SanDisk Extreme Portable SSD drive, a SamSung SXDC UHS-I EVO Select Card, and a Raspberry Pi Zero W.

I didn’t have access to my car because of the hypochondriac until the day of my #CO2Fre demo. I plugged in the SanDisk drive with its USB-C to USB-A adaptor and… nothing. I had the drive plugged in, but no camera was showing, and I couldn’t show off any of the Dashcam features during my entire presentation, including Dashcam footage of the speed test on the main screen after I parked, despite having the drive plugged in. The demo still went well, but I’m annoyed how hard I tried to get this working and still failed.

No Camera Icon
Sometimes the Camera with an X appears, but usually there’s no camera icon whatsoever, as can be seen here. © 2020, Jeffrey C. Jacobs

Afterwards, I tried to play around some more. Doing so requires me to go through decontamination because, for some reason, the hypochondriac thinks #CO2Fre has SARS-CoV-2. Meaning, I have to keep changing my clothes every time I go to the car because sitting in my car contaminates my clothes.

The drive was exFAT, so I reformatted it as FAT32. The drive did flash on the screen after some cord giggling, but it said it wasn’t formatted properly despite having the TeslaCam folder and being named TeslaCam. Since I’ve read that Tesla supports exFAT, I formatted it back as that, and it sits now, unable to connect.

2TB SanDisk
I have a 2TB SanDisk Solid-State Drive USB 3.1 compatible 10GB/s Drive plugging into #CO2Fre with a USB-C connector and a USB-C to USB-A adaptor hooked into #CO2Fre, yet #CO2Fre can’t see it! © 2020, Jeffrey C. Jacobs

I also tried my MicroSD chip with an adaptor. Originally, the chip was supposed to be part of the Raspberry Pi, but I wanted to test to see if it could be used as the TeslaCam directly. No dice. I’d hook up the Raspberry Pi and try with that, but I have to finish updating my Résumé and fix my broken Zone File updater for Reston Writers first. I just have too much going on to worry about going any further with this nightmare of Tesla‘s.

The way I see it, the drive works in a PC, the drive works in a Mac, it just doesn’t work in #CO2Fre. When you’ve tried everything else, the simple answer it so blame Tesla. So, I made a Mobile Service Request and they should be here Friday morning.

Why must Tesla make this so hard!?!?

In any case, unless I find another set of clothes to wear, even without my Dashcam, I shall very much miss cruising on a cloud.

Empty Polling Station

We could be a Less Democratic Republic… or More

Empty Polling Station
© Samuel Corum/Getty Images

Many on the left fear the President will use any means necessary to stay in power. An article in Slate, Trump Can’t Cancel the Election. But States Could Do It for Him. is typical of these type of concerns.

The truth, though, is that the President has no power to cancel the election. That power rests purly in the hands of the Congress.

Congress, not the president, has the power to move Election Day. And even if Congress did postpone the vote, the Constitution would terminate Trump’s term on Jan. 20, 2021.

Stern, Mark Joseph. “Trump Can’t Cancel the Election. But States Could Do It for Him.” Slate 13 March 2020.

Further, having spend over a decade working for the U.S. Military, I can guarantee the loyalty of the Joint Chiefs of Staff are to the Republic, and not to any individual President. Should any President, Democrat or Republican, refuse to leave office were someone new duly appointed on, be it 20 January 2021, 20 January 2025, or any appropriate day of power transition in the future, then the U.S. Military would remove the obstinate President from office, with force, if necessary. Such a military Coup d’État would be unheard of in American history, but would doubtlessly just be a bump in the smooth transition of power as the Military is expected to immediately cede power to the duly elected next President. Indeed, if a President refuses to leave office, it behooves the winner of the most recent election to beseech the Joint Chiefs of Staff to aid in the removal of the incalcitrant, losing President, to make sure he or she leaves office and that the newly elected President is installed.

All that said, it seems to me insane to consider any President, including the current occupant of our highest office wouldn’t leave come 20 January upon losing the prior election by the Electoral College. And I hope my readers know I stand firmly on the side of Republican Democracy. It’s not a question of party for me, it’s a question of whoever wins the election should take office.

the Constitution does not require states to assign their electors on the basis of the statewide vote. It does not even require a statewide vote. Rather, it explains that each state “shall appoint” its electors “in such manner as the Legislature thereof may direct.” In other words, each state legislature gets to decide how electors are appointed—and, by extension, who gets their votes.

Stern, Mark Joseph. “Trump Can’t Cancel the Election. But States Could Do It for Him.” Slate 13 March 2020.

The rub comes if states exercise their option, under Article II, Section 1, Paragraph 2—as amended—state legislatures are allowed to appoint electors by any means they see fit. They can vote to select electors, as some states did originally, not having the infrastructure to hold an election. They can hold an election and assign electors proportionally, as they did in the early in the Republic. They can have winner-take-all (plurality) elections. They can have direct election of electors, as Alabama did in 1960. They can even allow two electors to be chosen by state-wide Plurality and the rest chosen by potentially Gerrymandered Congressional District plurality, such as in Maine and Nebraska. The Constitution says nothing about how Electors are selected, it only says states legislatures get to chose their own method.

[The President] himself could not cancel the entire presidential election. But he could ask these GOP-dominated legislatures to cancel their statewide presidential elections and assign their electors to him. It’s doubtful that we will face this situation in November. But imagine a worst-case scenario: The election is approaching, and the coronavirus remains rampant in our communities. States are unsure whether they have the personnel and resources to hold an election. Congress has failed to mandate no-excuse absentee balloting, and many states have declined to implement it. Or the postal service is so hard hit that it cannot reliably carry ballots to and from voters’ residences. It’s not difficult to envision [The President]’s allies in state legislatures assigning their states’ electoral votes to the president, insisting that these dire circumstances justify pulling a constitutional fire alarm.

Stern, Mark Joseph. “Trump Can’t Cancel the Election. But States Could Do It for Him.” Slate 13 March 2020.

What the article fails to mention is that each state’s legislature operates under different rules. In Maryland and Virginia, for instance, their General Assemblies have strict deadlines before 1 July to finish conducting all legislative business. The only way new legislation can be adopted is from a direct order of the Governor, meaning for a state to cancel its election after 1 July, it would have to do so with the consent of its Governor and its Legislature. And while there are a number of state legislatures in single-party hands through Gerrymandering, the Governors are elected by popular vote and thus is not prone to Gerrymandering.

So while SARS-CoV-2 may cause difficult for voting, it’s doubtful any major legislature is going to cancel the election in 2020 due to the virus. However, let’s entertain that possibility for a moment.

state legislatures can appoint electors—the human beings themselves—but cannot then require them to vote for a particular candidate, or punish them if they do not. It seems unlikely that the court will grant “faithless electors” the ability to buck state legislatures and cast rogue votes. 

Stern, Mark Joseph. “Trump Can’t Cancel the Election. But States Could Do It for Him.” Slate 13 March 2020.

Here is where the article puts a bit too much faith in faithless electors. The truth is, the way electors are chosen in all states in 2020 is through a party-line slate. What happens is the election happens (or the state legislature directs), the states Secretaries of State (where such office exists) then contact the party of the winning candidate who then provide the state with a slate of electors. If the Democrat wins, the state selects the slate of electors provided by the Democratic Party, if the Republican wins, the state selects the slate of electors provided by the Republican Party. It’s very unlikely parties would select from amongst their party faithful someone who was not loyal to the candidate. And sticking pipedream hopes that even if Faithless Electors are preserved—as the U.S. Supreme Court is likely to rule—it’s unlikely any elector will be voting against their party or candidate.

Regardless of any SCOTUS decision, Faithless Electors will continue to be rare. If a bunch of state legislatures do decide the cancel the election of 3 November, it’s unlikely that you can count of faithlessness to give you any surprise outcome. While that may be a fear in terms of legislatures reverting to the original party appointment of electors without election, which would be a tragedy to our Democratic Republic, there is another way that would, in fact, increase our Democratic Reublican ideals.

National Popular Vote Interstate Compact

The National Popular Vote Interstate Compact (NPVIC) is an agreement between the signatory state such that, if the combined electoral college count of signatory states is 270, then these states will tabulate their popular votes, and combine those popular votes with the votes of all the other states in our American Union, and, based on the winner nationally, the Secretaries of State then select the slate of electors provided by the party of the candidate who won the National Popular Vote. Effectively, the person with the most votes nationally will become the next President of the United States.

Just as legislatures could cancel elections, they can also join the NPVIC and ensure that the winner of the popular vote is the winner of the national election, making this nation a more Democratic Republic, not less.

This isn’t a partisan issue. In 2004, a Republican almost lost the Electoral College despite winning the Popular Vote. This isn’t an issue of the Popular Vote advantaging one party over the other. Unfortunately, 2016 has blinded people to that fact. In truth, when it’s known long before the election how most states will vote, it concentrates all the power in a number of battleground states which are so close one could literally flip a coin to determine their outcome. Such concentrated power is against the will of the Framers. It disadvantages both big and small states alike, both rural and urban states alike. It helps no-one unless you happen to live in a Battleground. It’s not advantaging any party, it’s just the coin flipped heads a number of times. It will flip tails. We don’t know when, but it will. It could indeed be as soon as 2020.

Article II, Section 1, Paragraph 2 is a double-edged sword. It allows legislatures to take the power from the people, and it also allows them to grant it to all Americans, leveling out the playing field so that, no matter where you live, your vote will count as much as any other American.

We should have One Person, One Vote where Every Vote is Equal. Ask your state governments to pass the NPVIC today.

Join Me Today to see #CO2Fre in Cyberspace

I’m excited to show off #CO2Fre to all of you today on Zoom. My friend Charles Gerena has organized an exciting event where I will be lecturing on the advantages of EV ownership and my love for cruising on a cloud.

I love showing off #CO2Fre for Drive Electric Week and I love working with Charles. Each year, Charles organizes an EV Event in Richmond during the main session of the General Assembly of Virginia and 2020 was no exception. I was down there on Tuesday, 14 January showing of #CO2Fre to everyone who cared to stop by.

I was very happy to give a ride to Delegate Joshua G. Cole that day. He is someone we’ve been following for years, hoping to see him in office. I was so happy when he was finally, fairly elected to represent Fredericksburg. VA. He’s also a great singer!

2020 RVA Drive Electric Day in Richmond
On Tuesday, 14 January, 2020, I was back in Richmond to show off #CO2Fre to the various staff, Lobbyists, and of course, when opportunity arose, Delegates and Senators. 2020 was no exception and this year I gave a ride to none other than Del. Joshua Cole from Fredericksburg! He’s someone we have been fighting to get into office for years and it was so great to see him on his first year serving us as Delegate!

I was so happy to give Joshua a ride in #CO2Fre that day. That day was bright and sunny and although this day has started out with dreary rain, I’m hoping to have better weather when I show you around #CO2Fre and show you what #CO2Fre can do!

Join us on meetup and follow our Facebook event for updates and a video of our event, to be posted after we finish.

I look forward to cruising on a cloud with y’all, today.

Dusting off the Résumé, Part 2: Converting to HTML

Earlier, I shared with you the Schema I use for writing my Résumé in XML. In this post, I want to talk about how that XML becomes something human-readable: Hyper Text Markup Language (HTML).

I wrote my first Web Page in 1993, one year after Tim Berners-Lee released the now ubiquitous language of the Internet. Back then, to get information on the Internet you were restricted to dial-up Bulletin Board Systems (BBS), Gopher and Archie for file search and retrieval, and Usenet for staying abreast of the latest computer news or just chew the fat. I was, in fact, a very early adopter, immediately seeing the potential of HTML to revolutionize the world of digital communications.

What’s more, unlike JavaScript Object Notation (JSON), which is best for HTML POST requests and related operations, because HTML is a markup language and a full subset of XML, it makes more sense to encode my work history and Curriculum Vitae (CV). This is why I continue to maintain my Résumé and the longer form CV in XML and don’t convert it to JSON.

That said, it would be fascicle to convert XML to JSON and many application already do this.

The translation from XML to HTML, however, takes more finesse. Fortunately, there’s a subset of XML known as eXtensible Stylesheet Language Transformation (XSLT). XSLT is a rudimentary rule-based language with recursion. It allows me to iterate over fields and concatenate them with commas (,), or hide fields which are deprecated as no longer relevant to the modern software job market.

As such, XSLT is a very verbose language which requires many elements to define how each XML component will be handled. Nonetheless, the full transform is included below.

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:param name="amazon" select="'http://www.amazon.com/exec/obidos/ASIN/'"/>
<xsl:param name="deprecated_text" select="'Hidden text has been excized from this document!'"/>
<xsl:param name="redacted_text" select="'Redacted text has been blacked out from this document!'"/>
<xsl:param name="col_of_data" select="2"/>

<xsl:variable name="deprecated">
  <span class="deprecated">deprecated</span>
  <xsl:comment>
    <xsl:value-of select="$deprecated_text"/>
  </xsl:comment>
</xsl:variable>

<xsl:variable name="redacted">
  <span class="redacted">redacted</span>
  <xsl:comment>
    <xsl:value-of select="$redacted_text"/>
  </xsl:comment>
</xsl:variable>

<!-- Entities -->
<!-- Question: How do I get Entities to appear as entities?? -->

<!-- Pure (PCDATA) Elements -->
<!-- Names and Addresses -->

<xsl:template match="name">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="oldname">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="street">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="apartment">
  <xsl:choose>
    <!-- Use param / param-with -->
    <xsl:when test="@spellout = 'true'">
      <xsl:text disable-output-escaping="yes">Apartment&amp;nbsp;</xsl:text>
    </xsl:when>
    <xsl:otherwise>
      <xsl:text disable-output-escaping="yes">Apt.&amp;nbsp;</xsl:text>
    </xsl:otherwise>
  </xsl:choose>
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="city">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="state">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="province">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="postal">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="country">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="e-mail">
  <a href="mailto:{.}">
    <xsl:choose>
      <xsl:when test="parent::address">
        <xsl:attribute name="class">
          <xsl:text>address</xsl:text>
        </xsl:attribute>
      </xsl:when>
      <xsl:when test="parent::reference">
        <xsl:attribute name="class">
          <xsl:text>reference</xsl:text>
        </xsl:attribute>
      </xsl:when>
    </xsl:choose>
    <xsl:apply-templates/>
  </a>
</xsl:template>

<xsl:template match="phone">
  <xsl:apply-templates/> (H)
</xsl:template>

<xsl:template match="mobile">
  <xsl:apply-templates/> (M)
</xsl:template>
<!-- Keys and Headings -->

<xsl:template match="heading">
  <hr class="separator"/>
  <h2 class="heading">
    <xsl:apply-templates/>
  </h2>
</xsl:template>

<xsl:template match="key">
  <span class="text_heading">
    <xsl:apply-templates/>
  </span>
</xsl:template>

<xsl:template match="value">
  <xsl:apply-templates/>
</xsl:template>

<!-- Date and Time -->

<xsl:template match="year">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="month">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="day">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="hour">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="minute">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="second">
  <xsl:apply-templates/>
</xsl:template>

<!-- Descriptive Elements -->

<xsl:template match="position">
  <span class="position">
    <xsl:apply-templates/>
  </span>
</xsl:template>

<xsl:template match="product">
  <span class="product">
    <xsl:apply-templates/>
  </span>
</xsl:template>

<xsl:template match="degree">
  <span class="degree">
    <xsl:apply-templates/>
  </span>
</xsl:template>

<xsl:template match="course">
  <span class="course">
    <xsl:apply-templates/>
  </span>
</xsl:template>

<xsl:template match="author">
  <span class="author">
    <xsl:apply-templates/>
  </span>
</xsl:template>

<xsl:template match="author-et-al">
  <xsl:text> </xsl:text><span class="author"><em>et al</em></span>
</xsl:template>

<xsl:template match="publisher">
  <span class="publisher">
    <xsl:apply-templates/>
  </span>
</xsl:template>

<xsl:template match="subject">
  <p class="subject">
    <xsl:apply-templates/>
  </p>
</xsl:template>

<xsl:template match="isbn">
  <a class="isbn" href="{$amazon}{.}/">
    <xsl:apply-templates/>
  </a>
</xsl:template>

<!-- deprecated -->

<xsl:template match="deprecated">
  <!-- Ingore deprecated text -->
  <xsl:copy-of select="$deprecated"/>
</xsl:template>

<!-- Compound Elements -->
<!-- Compound Time -->

<xsl:template match="date">
  <span class="date">
    <xsl:if test="day">
      <!-- European Date Format -->
      <xsl:apply-templates select="day"/>
      <!-- day requires month, so we know that the month is next -->
      <xsl:text> </xsl:text>
    </xsl:if>
    <xsl:if test="month">
      <xsl:apply-templates select="month"/>
    </xsl:if>
    <xsl:if test="year">
      <xsl:if test="month">
        <xsl:text> </xsl:text>
      </xsl:if>
      <xsl:apply-templates select="year"/>
    </xsl:if>
    <xsl:if test="hour">
      <xsl:if test="not(*[position() = 1 and self::hour])">
        <xsl:text> </xsl:text>
      </xsl:if>
      <xsl:apply-templates select="country"/>
    </xsl:if>
    <xsl:if test="minute">
      <!-- Always follows hour -->
      <xsl:text>:</xsl:text>
      <xsl:apply-templates select="minute"/>
    </xsl:if>
    <xsl:if test="second">
      <!-- Always follows minute -->
      <xsl:text>:</xsl:text>
      <xsl:apply-templates select="second"/>
    </xsl:if>
  </span>
</xsl:template>

<xsl:template match="from">
  <span class="from_date">
    <xsl:apply-templates/>
  </span>
</xsl:template>

<xsl:template match="to">
  <span class="to_date">
    <xsl:apply-templates/>
  </span>
</xsl:template>

<xsl:template match="period">
  <xsl:choose>
    <xsl:when test="date">
      <p class="period">
        <xsl:apply-templates select="date"/>
      </p>
    </xsl:when>
    <xsl:when test="from and to">
      <p class="period">
        <xsl:apply-templates select="from"/>
        <xsl:text disable-output-escaping="yes"> &amp;ndash; </xsl:text>
        <xsl:apply-templates select="to"/>
      </p>
    </xsl:when>
  </xsl:choose>
</xsl:template>

<!-- Simple Compound Elements -->

<xsl:template match="address">
  <span class="address">
    <xsl:if test="street">
      <xsl:apply-templates select="street"/>
      <xsl:if test="apartment">
        <xsl:text>, </xsl:text>
        <xsl:apply-templates select="apartment"/>
      </xsl:if>
    </xsl:if>
    <xsl:if test="city">
      <xsl:if test="not(*[position() = 1 and self::city])">
        <xsl:text>, </xsl:text>
      </xsl:if>
      <xsl:apply-templates select="city"/>
    </xsl:if>
    <xsl:choose>
      <xsl:when test="state">
        <xsl:if test="not(*[position() = 1 and self::state])">
          <xsl:text>, </xsl:text>
        </xsl:if>
        <xsl:apply-templates select="state"/>
      </xsl:when>
      <xsl:when test="province">
        <xsl:if test="not(*[position() = 1 and self::province])">
          <xsl:text>, </xsl:text>
        </xsl:if>
        <xsl:apply-templates select="province"/>
      </xsl:when>
    </xsl:choose>
    <xsl:if test="postal">
      <xsl:if test="not(*[position() = 1 and self::postal])">
        <xsl:text> </xsl:text>
      </xsl:if>
      <xsl:apply-templates select="postal"/>
    </xsl:if>
    <xsl:if test="country">
      <xsl:if test="not(*[position() = 1 and self::country])">
        <xsl:text> </xsl:text>
      </xsl:if>
      <xsl:apply-templates select="country"/>
    </xsl:if>
    <xsl:if test="e-mail">
      <xsl:if test="not(*[position() = 1 and self::e-mail])">
        <br/>
      </xsl:if>
      <xsl:apply-templates select="e-mail"/>
    </xsl:if>
    <!-- TODO: Put the phone and mobile phone on the same line. -->
    <xsl:if test="phone">
      <xsl:if test="not(*[position() = 1 and self::phone])">
        <br/>
      </xsl:if>
      <xsl:apply-templates select="phone"/>
    </xsl:if>
    <xsl:if test="mobile">
      <xsl:if test="not(*[position() = 1 and self::mobile])">
        <br/>
      </xsl:if>
      <xsl:apply-templates select="mobile"/>
    </xsl:if>
  </span>
</xsl:template>

<xsl:template match="book">
  <xsl:choose>
    <xsl:when test="not(boolean(@deprecated))">
      <!-- This is a full Book Definition -->
      <p class="bibliography">
        <xsl:if test="author">
          <xsl:for-each select="author">
            <xsl:if test="not(position() = 1)">
              <xsl:text>, </xsl:text>
            </xsl:if>
            <xsl:if test="(position() = last() and not(boolean(../author-et-al)))">
              <xsl:text> and </xsl:text>
            </xsl:if>
            <xsl:apply-templates select="."/>
          </xsl:for-each>
          <xsl:if test="author-et-al">
            <xsl:apply-templates select="author-et-al"/>
          </xsl:if>
          <xsl:text>. </xsl:text>
        </xsl:if>
        <!-- If ISBN is provided, use to link to Amazon -->
        <xsl:choose>
          <xsl:when test="isbn">
            <a class="book" href="{$amazon}{isbn}/">
              <xsl:apply-templates select="name"/>
            </a>
          </xsl:when>
          <xsl:otherwise>
            <span class="book">
              <xsl:apply-templates select="name"/>
            </span>
          </xsl:otherwise>
        </xsl:choose>
        <xsl:if test="publisher | date">
          <xsl:text>. </xsl:text>
        </xsl:if>
        <xsl:if test="address">
          <xsl:apply-templates select="address"/>
          <!-- Publisher must follow -->
          <xsl:text>: </xsl:text>
        </xsl:if>
        <xsl:if test="publisher">
          <xsl:apply-templates select="publisher"/>
          <xsl:if test="date">
            <xsl:text>, </xsl:text>
          </xsl:if>
        </xsl:if>
        <xsl:if test="date">
          <xsl:apply-templates select="date"/>
        </xsl:if>
      </p>
      <xsl:if test="subject">
        <xsl:apply-templates select="subject"/>
      </xsl:if>
    </xsl:when>
    <xsl:otherwise>
      <!-- Ingore deprecated text -->
      <xsl:copy-of select="$deprecated"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template match="institution">
  <xsl:choose>
    <xsl:when test="not(boolean(@deprecated))">
      <!-- This is a full Institutional Definition -->
      <!-- Normally a Job or School will access the elements
           independently, so this is only bibliographical. -->
      <p class="institution">
        <xsl:choose>
          <xsl:when test="@url">
            <span class="institution">
              <a href="{@url}">
                <xsl:apply-templates select="name"/>
              </a>
            </span>
          </xsl:when>
          <xsl:otherwise>
            <span class="institution">
              <xsl:apply-templates select="name"/>
            </span>
          </xsl:otherwise>
        </xsl:choose>
        <xsl:for-each select="oldname">
          <xsl:choose>
            <xsl:when test="position() = 1">
              <xsl:text> (Formerly </xsl:text>
            </xsl:when>
            <xsl:when test="not(position() = last())">
              <xsl:text>; </xsl:text>
            </xsl:when>
          </xsl:choose>
          <xsl:apply-templates/>
          <xsl:if test="position() = last()">
            <xsl:text>)</xsl:text>
          </xsl:if>
        </xsl:for-each>
        <xsl:if test="address">
          <xsl:text>, </xsl:text>
          <xsl:apply-templates select="address"/>
        </xsl:if>
      </p>
    </xsl:when>
    <xsl:otherwise>
      <!-- Ingore deprecated text -->
      <xsl:copy-of select="$deprecated"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template match="bookref">
  <xsl:variable name="ref" select="@ref"/>
  <xsl:variable name="book" select="//book[@name = $ref]"/>
  <xsl:choose>
    <xsl:when test="not(boolean($book/@deprecated))">
      <xsl:choose>
        <xsl:when test="$book/@url">
          <a class="bookref" href="{$book/@url}">
            <xsl:apply-templates select="$book/name"/>
          </a>
        </xsl:when>
        <xsl:when test="$book/isbn">
          <a class="bookref" href="{$amazon}{$book/isbn}/">
            <xsl:apply-templates select="$book/name"/>
          </a>
        </xsl:when>
        <xsl:otherwise>
          <span class="bookref">
            <xsl:apply-templates select="$book/name"/>
          </span>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:when>
    <xsl:otherwise>
      <!-- Ingore deprecated text -->
      <xsl:copy-of select="$deprecated"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template match="instref">
  <xsl:variable name="ref" select="@ref"/>
  <xsl:variable name="inst" select="//institution[@name = $ref]"/>
  <xsl:choose>
    <xsl:when test="not(boolean($inst/@deprecated))">
      <!-- This is an Inline Institution, therefore treat as character formatting -->
      <xsl:choose>
        <xsl:when test="$inst/@url">
          <span class="instref">
            <a href="{$inst/@url}">
              <xsl:apply-templates select="$inst/name"/>
            </a>
          </span>
        </xsl:when>
        <xsl:otherwise>
          <span class="instref">
            <xsl:apply-templates select="$inst/name"/>
          </span>
        </xsl:otherwise>
      </xsl:choose>
      <xsl:if test="$inst/address">
        <xsl:text>, </xsl:text>
        <xsl:apply-templates select="$inst/address"/>
      </xsl:if>
    </xsl:when>
    <xsl:otherwise>
      <!-- Ingore deprecated text -->
      <xsl:copy-of select="$deprecated"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<!-- Simple Compound Markups -->

<xsl:template match="buzzword">
  <xsl:choose>
    <xsl:when test="not(boolean(@deprecated))">
      <xsl:choose>
        <xsl:when test="@url">
          <span class="buzzword">
            <a href="{@url}">
              <xsl:apply-templates/>
            </a>
          </span>
        </xsl:when>
        <xsl:otherwise>
          <span class="buzzword">
            <xsl:apply-templates/>
          </span>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:when>
    <xsl:otherwise>
      <!-- Ingore deprecated text -->
      <xsl:copy-of select="$deprecated"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template match="language">
  <xsl:choose>
    <xsl:when test="not(boolean(@deprecated))">
      <span class="language">
        <xsl:apply-templates/>
      </span>
      <!-- Level is Required -->
      <xsl:text> (</xsl:text>
      <xsl:value-of select="@level"/>
      <xsl:text>)</xsl:text>
    </xsl:when>
    <xsl:otherwise>
      <!-- Ingore deprecated text -->
      <xsl:copy-of select="$deprecated"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template match="status">
  <p class="status">
    <span class="text_heading">
      <xsl:value-of select="key"/>
      <xsl:text>: </xsl:text>
    </span>
    <xsl:apply-templates select="value"/>
  </p>
</xsl:template>

<xsl:template match="skill">
  <xsl:choose>
    <xsl:when test="not(boolean(@deprecated))">
      <p class="skill">
        <span class="text_heading">
          <xsl:value-of select="key"/>
          <xsl:text>: </xsl:text>
        </span>
        <!-- Use for-each to get buzzwords or languages because they
             cannot appear in the same skill set, so if one for-each
             has not element, it is not executed and saves me the trouble
             of writing an xsl:if or writing xsl:for-each
             select="*[self::buzzword | self::langauge]" -->
        <xsl:for-each select="buzzword[not(boolean(@deprecated))]">
          <xsl:if test="not(position() = 1)">
            <xsl:text>, </xsl:text>
          </xsl:if>
          <xsl:apply-templates select="."/>
        </xsl:for-each>
        <xsl:for-each select="language[not(boolean(@deprecated))]">
          <xsl:if test="not(position() = 1)">
            <xsl:text>, </xsl:text>
          </xsl:if>
          <xsl:apply-templates select="."/>
        </xsl:for-each>
      </p>
    </xsl:when>
    <xsl:otherwise>
      <!-- Ingore deprecated text -->
      <xsl:copy-of select="$deprecated"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template match="curriculum">
  <xsl:choose>
    <xsl:when test="not(boolean(@deprecated))">
      <p class="curriculum">
        <xsl:if test="child::key">
          <span class="text_heading">
            <xsl:value-of select="key"/>
            <xsl:text>: </xsl:text>
          </span>
        </xsl:if>
        <xsl:for-each select="course">
          <xsl:if test="not(position() = 1)">
            <xsl:text>, </xsl:text>
          </xsl:if>
          <xsl:apply-templates select="."/>
        </xsl:for-each>
      </p>
    </xsl:when>
    <xsl:otherwise>
      <!-- Ingore deprecated text -->
      <xsl:copy-of select="$deprecated"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template match="tools">
  <span class="tools">
    <xsl:for-each select="buzzword[not(boolean(@deprecated))]">
      <xsl:if test="not(position() = 1)">
        <xsl:text>, </xsl:text>
      </xsl:if>
      <xsl:apply-templates select="."/>
    </xsl:for-each>
  </span>
</xsl:template>

<xsl:template match="task">
  <li class="task"/>
  <p class="task">
    <xsl:apply-templates/>
  </p>
</xsl:template>

<xsl:template match="interest">
  <xsl:choose>
    <xsl:when test="@url">
      <a class="interest" href="{@url}">
        <xsl:apply-templates/>
      </a>
    </xsl:when>
    <xsl:otherwise>
      <span class="interest">
        <xsl:apply-templates/>
      </span>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template match="para">
  <!-- This will typically be overridden by another template -->
  <p>
    <xsl:apply-templates/>
  </p>
</xsl:template>

<xsl:template match="objective">
  <xsl:for-each select="para">
    <p class="objective">
      <xsl:apply-templates/>
    </p>
  </xsl:for-each>
</xsl:template>

<xsl:template match="summary">
  <xsl:for-each select="para">
    <p class="summary">
      <xsl:apply-templates select="."/>
    </p>
  </xsl:for-each>
  <table border="0" width="100%">
    <xsl:for-each select="task">
      <xsl:choose>
        <xsl:when test="position() mod $col_of_data = 1">
          <xsl:text disable-output-escaping="yes">&lt;tr&gt;</xsl:text>
        </xsl:when>
        <xsl:otherwise>
          <td>
            <img src="spacer.gif" class="spacer"/>
          </td>
        </xsl:otherwise>
      </xsl:choose>
      <!-- Spacer messes the percentage up! -->
      <td class="task" width="{100 div $col_of_data}%">
        <xsl:apply-templates select="."/>
      </td>
      <xsl:if test="position() mod $col_of_data = 0">
        <xsl:text disable-output-escaping="yes">&lt;/tr&gt;</xsl:text>
      </xsl:if>
    </xsl:for-each>
    <!-- Extra Close Row for odd numbers -->
    <xsl:if test="count(task) mod $col_of_data != 0">
      <xsl:text disable-output-escaping="yes">&lt;/tr&gt;</xsl:text>
    </xsl:if>
  </table>
</xsl:template>

<xsl:template match="achievement">
  <!-- Do the First Paragraph Separately with Tools, then the rest -->
  <!-- Problem with indentation and blank line after -->
  <li class="achievement"/>
  <p class="achievement">
    <xsl:if test="tools">
      <!-- Double Spanning on Tools! -->
      <xsl:apply-templates select="tools"/>
      <xsl:if test="para">
        <span class="tools">
          <xsl:text>: </xsl:text>
        </span>
      </xsl:if>
    </xsl:if>
    <!-- Wacky way of saying "Don't Apply this template,
         apply the ones below! -->
    <xsl:for-each select="para[1]">
      <xsl:apply-templates/>
    </xsl:for-each>
  </p>
  <xsl:for-each select="para[position() &gt; 1]">
    <!-- Convert to Unordered List -->
    <p class="achievement">
      <xsl:apply-templates/>
    </p>
  </xsl:for-each>
</xsl:template>

<xsl:template match="title">
  <span class="title">
    <h1 class="name">
      <xsl:apply-templates select="name"/>
      <xsl:for-each select="oldname">
        <xsl:if test="position() = 1">
          <xsl:text> (</xsl:text>
        </xsl:if>
        <xsl:apply-templates/>
        <xsl:choose>
          <xsl:when test="position() = last()">
            <xsl:text>)</xsl:text>
          </xsl:when>
          <xsl:otherwise>
            <xsl:text>, </xsl:text>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each>
    </h1>
    <p class="address">
      <xsl:apply-templates select="address"/>
    </p>
  </span>
</xsl:template>

<xsl:template match="bibliography">
  <xsl:if test="not(boolean(@deprecated))">
    <xsl:if test="heading">
      <xsl:apply-templates select="heading"/>
    </xsl:if>
    <xsl:for-each select="book">
      <xsl:apply-templates select="."/>
    </xsl:for-each>
    <xsl:for-each select="institution">
      <xsl:apply-templates select="."/>
    </xsl:for-each>
  </xsl:if>
</xsl:template>

<xsl:template match="job">
  <xsl:if test="not(boolean(@deprecated))">
    <table width="100%">
      <tr>
        <td>
          <xsl:apply-templates select="institution"/>
        </td>
        <td>
          <img src="spacer.gif" class="spacer"/>
        </td>
        <td>
          <!-- To Do: Please try to if the position is
               present, extend this cell and the spacer
               to rowspan="2" -->
          <!-- Problem: Width of "Period" too small! -->
          <xsl:apply-templates select="period"/>
        </td>
      </tr>
      <xsl:if test="position">
        <tr>
          <td colspan="2">
            <xsl:apply-templates select="position"/>
          </td>
        </tr>
      </xsl:if>
      <xsl:for-each select="achievement">
        <tr>
          <td colspan="2">
            <xsl:apply-templates select="."/>
          </td>
        </tr>
      </xsl:for-each>
    </table>
  </xsl:if>
</xsl:template>

<xsl:template match="school">
  <xsl:if test="not(boolean(@deprecated))">
    <table width="100%">
      <tr>
        <td>
          <xsl:apply-templates select="institution"/>
        </td>
        <td>
          <img src="spacer.gif" class="spacer"/>
        </td>
        <td>
          <!-- To Do: Please try to, if the degree is
               present, extend this cell and the spacer
               to rowspan="2" -->
          <!-- Problem: Width of "Period" too small! -->
          <xsl:apply-templates select="period"/>
        </td>
      </tr>
      <xsl:if test="degree">
        <tr>
          <td colspan="2">
            <xsl:apply-templates select="degree"/>
          </td>
        </tr>
      </xsl:if>
      <xsl:for-each select="achievement">
        <tr>
          <td colspan="2">
            <xsl:apply-templates select="."/>
          </td>
        </tr>
      </xsl:for-each>
      <xsl:for-each select="curriculum">
        <tr>
          <td colspan="2">
            <xsl:apply-templates select="."/>
          </td>
        </tr>
      </xsl:for-each>
    </table>
  </xsl:if>
</xsl:template>

<xsl:template match="reference">
  <xsl:if test="not(boolean(@deprecated))">
    <p class="reference">
      <xsl:apply-templates select="name"/>
      <xsl:if test="position">
        <br/>
        <xsl:apply-templates select="position"/>
      </xsl:if>
      <xsl:if test="instref">
        <!-- Since we know the Institution-Reference requires a
             position, we will add the comma here before the
             institution definition -->
        <xsl:text>, </xsl:text>
        <xsl:apply-templates select="instref"/>
      </xsl:if>
      <xsl:if test="e-mail">
        <br/>
        <xsl:apply-templates select="e-mail"/>
      </xsl:if>
      <xsl:if test="phone">
        <br/>
        <xsl:apply-templates select="phone"/>
      </xsl:if>
      <xsl:if test="mobile">
        <br/>
        <xsl:apply-templates select="mobile"/>
      </xsl:if>
    </p>
  </xsl:if>
</xsl:template>

<xsl:template match="section">
  <xsl:if test="not(boolean(@deprecated))">
    <xsl:apply-templates select="heading"/>
    <xsl:choose>
      <xsl:when test="child::objective">
        <xsl:apply-templates select="objective"/>
      </xsl:when>
      <xsl:when test="child::status">
        <table border="0" width="100%">
          <!-- For Simplicity I will but the Spanning cells first -->
          <!-- Ideally, the XSL should use an iterative approach that
               would end a row tag when it finds a spanning, then
               span the cell across all columns, then reset the
               numbering to "1" or some odd number to continue the
               data as if the next cell was the first one.  The problem
               with this is simply that I can't reset the position()
               counter to do this.  So, voilà, the simple approach -->
          <xsl:for-each select="status[@spanning = 'true']">
            <tr>
              <td class="status" colspan="{$col_of_data}">
                <xsl:apply-templates select="."/>
              </td>
            </tr>
          </xsl:for-each>
          <xsl:for-each select="status[not(boolean(@spanning))]">
            <xsl:choose>
              <xsl:when test="position() mod $col_of_data = 1">
                <xsl:text disable-output-escaping="yes">&lt;tr&gt;</xsl:text>
              </xsl:when>
              <xsl:otherwise>
                <td>
                  <img src="spacer.gif" class="spacer"/>
                </td>
              </xsl:otherwise>
            </xsl:choose>
            <!-- Spacer messes the percentage up! -->
            <td class="status" width="{100 div $col_of_data}%">
              <xsl:apply-templates select="."/>
            </td>
            <xsl:if test="position() mod $col_of_data = 0">
              <xsl:text disable-output-escaping="yes">&lt;/tr&gt;</xsl:text>
            </xsl:if>
          </xsl:for-each>
          <!-- Extra Close Row for odd numbers -->
          <xsl:if test="count(resume/section/summary/task) mod $col_of_data != 0">
            <xsl:text disable-output-escaping="yes">&lt;/tr&gt;</xsl:text>
          </xsl:if>
        </table>
      </xsl:when>
      <xsl:when test="child::summary">
        <xsl:apply-templates select="summary"/>
      </xsl:when>
      <xsl:when test="child::skill">
        <xsl:for-each select="skill">
          <xsl:apply-templates select="."/>
        </xsl:for-each>
      </xsl:when>
      <xsl:when test="child::job">
        <xsl:for-each select="job">
          <xsl:apply-templates select="."/>
          <!-- Blank Line After to separate Records? -->
        </xsl:for-each>
      </xsl:when>
      <xsl:when test="child::school">
        <xsl:for-each select="school">
          <!-- Blank Line After to separate Records? -->
          <xsl:apply-templates select="."/>
        </xsl:for-each>
      </xsl:when>
      <xsl:when test="child::interest">
        <xsl:for-each select="interest">
          <xsl:if test="not(position() = 1)">
            <xsl:text>, </xsl:text>
          </xsl:if>
          <xsl:apply-templates select="."/>
        </xsl:for-each>
      </xsl:when>
      <xsl:when test="child::reference">
        <xsl:for-each select="reference">
          <xsl:apply-templates select="."/>
        </xsl:for-each>
      </xsl:when>
    </xsl:choose>
  </xsl:if>
</xsl:template>

<xsl:template match="/">
  <html>
  <head>
  <link href="Résumé.css" rel="stylesheet" type="text/css"/>
  <xsl:apply-templates select="resume/title"/>
  </head>
  <body>
    <xsl:for-each select="resume/section[not(boolean(@deprecated))]">
      <xsl:apply-templates select="."/>
    </xsl:for-each>
    <xsl:apply-templates select="resume/bibliography[not(boolean(@deprecated))]"/>
    <hr class="separator"/>
    <xsl:if test="resume/@url">
      <table width="100%">
        <tr>
          <td width="33%"></td>
          <td width="67%">
            <p class="online">
              <xsl:text>Text available on-line at </xsl:text>
              <a type="online" href="{resume/@url}">
                <xsl:value-of select="resume/@url"/>
              </a>
              <xsl:text>.</xsl:text>
            </p>
          </td>
        </tr>
      </table>
    </xsl:if>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

Résumé.xsl, the eXstensible Stylesheet Language Transform of an XML Résumé.

Once the XML has been translated to HTML, it’s still rather rough. However, one can use Cascaded Style Sheets (CSS) to transform that raw XML into something much more pleasant to look at. It also hides Deprecated elements to they don’t appear in the final, rendered page. It sets the font, and colors the hard breaks, and formats everything in neat boxes.

Because the XSLT adds class modifiers to a number of the tags, the CSS can be rather richly defined and very specific to each document element.

body
{
    FONT-SIZE: 11pt;
    FONT-FAMILY: 'Times New Roman'
}
td
{
vertical-align : top;
}
span..buzzword
{
    FONT-STYLE: italic;
    FONT-FAMILY: 'Courier New'
}
span.institution
{
}
p.summary
{
    TEXT-ALIGN: justify
}
hr.separator
{
    BORDER-RIGHT: blue thick groove;
    BORDER-TOP: blue thick groove;
    BORDER-LEFT: blue thick groove;
    BORDER-BOTTOM: blue thick groove
}
H2.heading
{
    BORDER-TOP: medium none;
    FONT-SIZE: 12pt;
    COLOR: blue;
    FONT-FAMILY: Helvetica;
    LETTER-SPACING: 6pt;
    TEXT-ALIGN: center
}
H1.name
{
    FONT-WEIGHT: bolder;
    FONT-SIZE: 20pt;
    TEXT-ALIGN: center
}
SPAN.title
{
    COLOR: #ff9900;
    FONT-STYLE: italic;
    FONT-FAMILY: Helvetica;
    TEXT-ALIGN: center
}
P.address
{
    TEXT-ALIGN: center
}
SPAN.address
{
}
SPAN.text_heading
{
    FONT-WEIGHT: bolder
}
SPAN.position
{
    FONT-STYLE: italic;
    FONT-FAMILY: Arial
}
SPAN.product
{
    FONT-STYLE: italic
}
SPAN.degree
{
    FONT-STYLE: italic;
    FONT-FAMILY: Arial
}
SPAN.course
{
}
SPAN.author
{
}
A.isbn
{
    VISIBILITY: inherit
}
SPAN.date
{
}
SPAN.from_date
{
}
SPAN.to_date
{
}
P.period
{
    COLOR: #800080;
    FONT-STYLE: italic;
    TEXT-ALIGN: right
}
SPAN.publisher
{
}
P.bibliography
{
}
A.book
{
    VISIBILITY: inherit;
    FONT-STYLE: italic
}
SPAN.book
{
    FONT-STYLE: italic
}
SPAN.language
{
}
P.subject
{
}
SPAN.instref
{
    FONT-STYLE: italic
}
P.institution
{
    FONT-WEIGHT: bolder;
    FONT-SIZE: 12pt;
    FONT-FAMILY: Arial
}
A.address
{
    VISIBILITY: inherit
}
P.status
{
}
P.skill
{
}
P.curriculum
{
}
SPAN.tools
{
    FONT-WEIGHT: bolder;
    COLOR: #4c8000
}
P.task
{
}
SPAN.interest
{
}
A.interest
{
    VISIBILITY: inherit
}
P.objective
{
}
HEAD
{
    FONT-SIZE: 11pt;
    FONT-FAMILY: 'Times New Roman'
}
P.reference
{
}
P.online
{
    TEXT-ALIGN: right
}
A.online
{
    VISIBILITY: inherit
}
SPAN.redacted
{
    color: black;
    background-color: black;
    TEXT-DECORATION: line-through;
    font-style: italic
}
SPAN.deprecated
{
    DISPLAY: none;
    TEXT-DECORATION: line-through
}
TD.task
{
    VERTICAL-ALIGN: top;
    LIST-STYLE-TYPE: disc
}
TD.status
{
    VERTICAL-ALIGN: top;
}
img.spacer
{
width : 10px;
}
li.task
{
list-style-type : disc;
}
li.achievement
{
list-style-type : disc;
}

Résumé.css, the Cascaded Style Sheet used to transform the Résumé.

Once the CSS is applied, the final Résumé can be generated. Although I still had to perform some tweaking to the HTML, mainly to fix deprecated sections to eliminate trailing commas and other cleanups, for the most part, once the CSS was applied, the Résumé looked nearly perfect. The only change to the above CSS, because CSS on this site is site-wide, was that I put everything within a resume2002 class so that the CSS didn’t apply to every post, only to those inside a Résumé block.

You can see what the final, 2002 version, with a couple modern edits for some of my subsequent publications, of the Résumé looks like here.

I am working on an update to the XML Résumé thanks to figuring out how to get around the Xmplify bug with including Entity definition in an XML Schema. Apparently, if you Entities in your XML, you need to use a DTD to define your XML, you can’t use XML Schema. Fortunately, I did have the full DTD version of my XML specification, so that was easy to solve in the short term while Xmplify is fixed to allow XML Schema with entity-only DOCTYPE sections at the top of XML documents.

I have one final note about the code included in the Résumé in XML posts. In part 1, I neglected to take into account multiple spaces would get reduced to one, meaning that the formatting lost all of the proper indentation and made the code hard to read. I was hasty when I generated the HTML-compatable markup for the two documents there. When I generated the above documents, however, I generated the correct HTML using the simply four lines of Python below, once for each file.

>>> with open('Résumé.xml', 'rb') as f:
...     xml = f.read().decode('latin_1')
... 
>>> with open('xml.html', 'w') as f:
...     f.write(html.escape(xml).replace('\n', '
').replace(' ', ' '))
... 
>>>

Python code to turn XML into into readable HTML

I would love to show you the 2020 version of my Résumé but, alas, I’m still working on it and still have 2002–2012 to cover. I did write entries for 2010–2012, but then realized that I combined the description of two distinct projects into one, so I have to rewrite that section and then finish the first eight years of entries. That killed my Friday when this post was supposed to go out.

I figure that will take me another week, and have about five more projects to cover, but won’t know for sure until I go through the remaining Year End Reviews. But I do have the complete last eight years and, again, if you like what you see, I’m still happily available for hire.

The Green Card

A Timer Most Colourful

Today, I will be the official Timer for tonight’s Loudoun Toastmasters. Last time, I was on hold to do an Evaluation but the speech maker was ill so instead I was instead without a role. On the upside, it gave me time to consider using my Zoom background to enhance the effect of the Timer role. I was therefore anxious to try it out as soon as possible.

Originally, my dear friend Capt. Laura Savino was planning to be Timer, but, since SARS-CoV-2 she’s been busy hanging out with her wonderful boys as she’s hunkered down, sheltered in place. Hope to see her again after Covidapolis is over. But, in the mean time, for tonight, I’ll be stepping into her role.

The role of the timer is to time how long speeches are and to indicate when time is running out to the speaker. Each speech has a minimum time. When that time is hit, I indicate success with a green background.

The Green Card
The Yellow Card in Toastmasters means you’re met the minimum time requirement

Next, when a speaker is half-way through her or his allotted time, I flash the yellow background.

The Yellow Card
The Yellow Card in Toastmasters means you’re half-way through your allotted, acceptable time

Finally, when the speaker is out of time, I flash the red background. At this point, the speaker has thirty seconds to wrap up or be disqualified because his or her speech ran too long.

The Red Card
The Red Card in Toastmasters means you’re out of time

I time all speeches, which range from 5–7 minutes for a standard speech, 4–6 minutes for an Ice Breaker speech, 1–2 minutes for a Table Topic speech, and 2–3 minutes for Evaluations.

It all happens tonight. Stand up straight and deliver my friends!