- You can define a template to match on
script/command
and eliminate the xsl:for-each
concat()
can be used to shorten the expression and save you from explicitly inserting so many <xsl:text>
and <xsl:value-of>
elements.
- The use of an entity reference


for the carriage return, rather than relying on preserving the line-break between your <xsl:text>
element is a bit more safe, since code formatting won’t mess up your line breaks. Also, for me, it reads as an explicit line-break and is easier to understand the intent.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format" >
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="script/command">
<xsl:value-of select="concat('at -f '
,username
,' '
,startTime/@hours
,':'
,startTime/@minutes
,' '
,startDate
,'
')"/>
</xsl:template>
</xsl:stylesheet>