This week I was fortunate to attend the inaugural PowerShell Summit. Among the various sessions, Jeffrey Hicks presented on conditional HTML formatting with PowerShell. The native mdlet does a nice job converting objects to HTML tables, but has no support for applying custom styles to individual table elements.
Jeff called out the clever idea of using ConvertTo-HTML
to generate
XHTML, then using PoSH to manipulate that as XML. Jeff’s
technique uses the standard PoSH object model to apply CSS styles to
rows. In my case, I had a table where I needed to apply formatting to
individual cell entries (TD elements). Further complicating things,
rather than testing a single column, any cell entry with a particular
value (in my case, a value of ‘False’) was one I needed to flag with my
style. Referencing cell values via the object model wasn’t returning a
simple value that I could modified. What to do?
The answer, it turns out, is to call upon an old foe of mine,
XPATH. After much wailing and
gnashing of teeth, a simple query of $html.SelectNodes
wound up being the magic incantation. Piping this to a foreach loop let
me append an XML attribute which I could then append to each of the TD
elements returned from the query. A quick dump of the object via
$html.innerxml
and, as they say, “Bob’s your uncle!”
Yes, it’s a simple technique, but one that foiled me for a couple of days – I did say that XPATH is my nemesis, right?