Re: [xsl] pretty-printing XML

Subject: Re: [xsl] pretty-printing XML
From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx>
Date: Wed, 26 Mar 2003 22:26:10 +0000
Mike Brown wrote:
>>> In particular, my XML has lots of very long comment lines, which I
>>> would like to be wrapped to a sensible line length, and indented
>>> with a hanging indent like this:
>>>
>>>   <!-- blah blah
>>>     blah blah
>>>     blah blah -->
[snip]
> Nevertheless, it is possible to devise a word-wrapping algorithm in
> pure XSLT, with hanging indents, even. It would be very slow and
> about 200 lines long, though. We used to use something like this to
> generate documentation, but I recently switched us to using an
> extension function that uses a Python 1-liner to do most of the
> work.

For what it's worth, XSLT 2.0 makes this a whole lot easier with its
regular expression support. For example, you could use:

<xsl:template match="comment()">
  <xsl:text>&lt;!-- </xsl:text>
  <xsl:analyze-string select="normalize-space(.)"
                      regex=".{{1,69}}(\s|$)">
    <xsl:matching-substring>
      <xsl:if test="position() != 1"><xsl:text>     </xsl:text></xsl:if>
      <xsl:value-of select="." />
      <xsl:text>&#xA;</xsl:text>
    </xsl:matching-substring>
  </xsl:analyze-string>
  <xsl:text>     --></xsl:text>
</xsl:template>

[Note the doubling of the {}s in the regex attribute because it's an
attribute value template; that's caught me out twice today!]

You could use something more subtle than normalize-space() to preserve
*some* of the spacing within the comment but not others.

Cheers,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread