Re: [xsl] How to produce a record of changes made in an identity transform?

Subject: Re: [xsl] How to produce a record of changes made in an identity transform?
From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx>
Date: Wed, 28 Jul 2004 11:23:38 -0400
Munna,

One way of approaching this is to provide your output not only with the near-copy of your input, but to "annotate" it with elements (probably in a separate namespace) logging the changes made. Then in a separate pass (or two of them) you filter the result into two -- one that contains just the transform results you wanted, another that contains your change log. In XSLT 2.0, all these traversals can be accomplished in a single run of the stylesheet.

So:
<xsl:template match="onlyNum">
  <xsl:variable name="result">
    <onlyNum>
      <xsl:analyze-string select="." regex="^(\w+)(\s)*([.])(\s)*$" flags="m">
        <xsl:matching-substring>
          <xsl:value-of select="regex-group(1)" />
        </xsl:matching-substring>
      </xsl:analyze-string>
    </onlyNum>
  </xsl:variable>
  <xsl:copy-of select="$result"/>
  <log:change xmlns:log="yournamespaceURI">
    <xsl:copy-of select="."/>
    <xsl:text> changed to </xsl:text>
    <xsl:copy-of select="$result"/>
  </log:change>
</xsl:template>

This approach was first suggested to me by my boss, Tommie Usdin ("XSL-List Owner" to all y'all). Of course, it can be applied to any transform, not just near-copies.

Cheers,
Wendell

At 07:13 AM 7/28/2004, you wrote:
Hello all,
I had posted this query yesterday, but realised that the subject of the message didn't quite clarify my question, hence this repost. Apologies to those who have already seen this message.
Here's my problem:
I have the following stylesheet which essentially performs an identity transform on a given xml instance, producing a copy with
only slight changes (the e.g. below has one of these -- stripping out the concluding punctuation from element 'onlyNum' -- but the actual stylesheet will have more). I would like to produce another document that records these changes, at least as a list containing the original and changed node. this can be either text or xml, something on the lines of:
<onlyNum>E345.</onlyNum> changed to
<onlyNum>E345</onlyNum>
I have a feeling this could be done with xsl:result-document, but am not sure how to proceed. Any suggestions would be most welcome.


Thanks in advance,

Munna

-----------
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>


<xsl:output method="xml" indent="no"
omit-xml-declaration="yes"/>

<xsl:template match="/|@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="onlyNum">
        <onlyNum>
                <xsl:analyze-string select="."
regex="^(\w+)(\s)*([.])(\s)*$" flags="m">
                        <xsl:matching-substring>
                                <xsl:value-of select="regex-group(1)" />
                        </xsl:matching-substring>
                </xsl:analyze-string>
        </onlyNum>
</xsl:template>

</xsl:stylesheet>


======================================================================
Wendell Piez                            mailto:wapiez@xxxxxxxxxxxxxxxx
Mulberry Technologies, Inc.                http://www.mulberrytech.com
17 West Jefferson Street                    Direct Phone: 301/315-9635
Suite 207                                          Phone: 301/315-9631
Rockville, MD  20850                                 Fax: 301/315-8285
----------------------------------------------------------------------
  Mulberry Technologies: A Consultancy Specializing in SGML and XML
======================================================================

Current Thread