Re: [xsl] Seek your suggestions on how to create a declarative mapping document with embedded XSLT commands

Subject: Re: [xsl] Seek your suggestions on how to create a declarative mapping document with embedded XSLT commands
From: "Dimitre Novatchev dnovatchev@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Thu, 21 Apr 2022 18:31:42 -0000
I personally would try to use the "fill-in the blanks" design principle --
as much as possible:

    <DateOfPublication>
        <Year>$$(substring($Published, 1, 4))</Year>
        <Month> $$(substring($Published, 5, 2))</Month>
        <Day> $$(substring($Published, 7, 2))</Day>
    </DateOfPublication>

The above is (a fragment of) a separate XML document, and will be one of
the inputs of the transformation that fills-in the blanks and produces the
final result.

Thanks,
Dimitre

On Thu, Apr 21, 2022 at 9:36 AM Roger L Costello costello@xxxxxxxxx <
xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:

> Hi Folks,
>
> I have fallen into the trap of creating my own little mapping language and
> then writing an interpreter for my little language. I am hoping you can
> help me out of this trap and show me how to replace my little language with
> XSLT and use an XSLT processor.
>
> Here's the background:
>
> I am tasked to create a document which shows the mapping between one XML
> vocabulary and another. In addition, I need to implement a tool that
> performs the mapping, i.e., the tool takes an instance of the source XML
> vocabulary and generates an instance of the destination XML vocabulary,
> using the mapping document:
>
> (source document, mapping document) --> tool --> destination document
>
> Let's take a simple example.
>
> The source XML vocabulary has an element whose value is a date (YYYYMMDD):
>
> <Published>20220421</Published>
>
> The destination XML vocabulary has three elements, one containing a year
> (YYYY), a second containing a month (MM), and a third containing a day
> (DD). The three elements are enclosed within an element:
>
> <DateOfPublication>
>     <Year>2022</Year>
>     <Month>04</Month>
>     <Day>21</Day>
> </DateOfPublication>
>
> The mapping document must record that characters 1-4 of Published maps to
> the Year element in DateOfPublication, characters 5-6 maps to the Month
> element, and characters 7-8 maps to the Day element.
>
> Remember, in addition to the mapping document I need to write a tool that
> processes the mapping document to auto-generate a destination document. So
> in my mapping document I provide machine-processable instructions to the
> tool on how to perform the mapping:
>
> <mapping>
>     <row>
>         <destination-element>DateOfPublication/Year</destination-element>
>         <source-element>Published</source-element>
>         <appinfo>
>             <substring>
>                 <start>1</start>
>                 <length>4</length>
>             </substring>
>         </appinfo>
>     </row>
>     <row>
>         <destination-element> DateOfPublication/Month</destination-element>
>         <source-element>Published</source-element>
>         <appinfo>
>             <substring>
>                 <start>5</start>
>                 <length>2</length>
>             </substring>
>         </appinfo>
>     </row>
>     <row>
>         <destination-element> DateOfPublication/Day</destination-element>
>         <source-element>Published</source-element>
>         <appinfo>
>             <substring>
>                  <start>7</start>
>                  <length>2</length>
>             </substring>
>         </appinfo>
>     </row>
> </mapping>
>
> "What's that appinfo element?" you ask. The appinfo element informs the
> tool how to do the mapping. For example, this appinfo:
>
>         <appinfo>
>             <substring>
>                 <start>1</start>
>                 <length>4</length>
>             </substring>
>         </appinfo>
>
> informs the tool: get a substring of the source element (Published)
> starting at character 1 for a length of 4 and use it as the value of the
> destination element (DateOfPublication/Year).
>
> That is a little language that I made up. The tool must be implemented to
> interpret my little language.
>
> Ugh!
>
> It would be better if I didn't invent a language.
>
> It would be nice if I could use XSLT to express both the mapping as well
> as code for doing the mapping.
>
> I could write an XSLT program like this:
>
> <xsl:template match="/">
>     <DateOfPublication>
>         <Year><xsl:value-of select="substring($source/Published, 1,
> 4)"/></Year>
>         <Month><xsl:value-of select="substring($source/Published, 5,
> 2)"/></Month>
>         <Day><xsl:value-of select="substring($source/Published, 7,
> 2)"/></Day>
>     </DateOfPublication>
> </xsl:template>
>
> But that's even worse than my mapping approach. Why? Because now the
> mapping is buried in code. My clients don't understand XSLT. At least my
> clients can understand my mapping (they ignore the appinfo part).
>
> You might suggest, "Well, keep the mapping document (discard the appinfo
> part) and supplement it with the above XSLT program. That's even more
> worse. It has the mapping repeated in two places - in my mapping document
> and in XSLT code.
>
> What I want is something like this:
>
> <mapping>
>     <row>
>         <destination-element>DateOfPublication/Year</destination-element>
>         <source-element>Published</source-element>
>         <appinfo>
>             <Year>
>                 <!-- XSLT code that maps characters 1-4 of Published to
> DateOfPublication/Year -->
>            </Year>
>         </appinfo>
>     </row>
> ...
>
> When I "run" that document, all the XSLT snippets get executed (by an XSLT
> processor).
>
> Well, I think that's what would be really good, but I seek your
> suggestions. How to create a declarative mapping document with embedded
> XSLT commands?
>
> /Roger
> 
>
>

-- 
Cheers,
Dimitre Novatchev
---------------------------------------
Truly great madness cannot be achieved without significant intelligence.
---------------------------------------
To invent, you need a good imagination and a pile of junk
-------------------------------------
Never fight an inanimate object
-------------------------------------
To avoid situations in which you might make mistakes may be the
biggest mistake of all
------------------------------------
Quality means doing it right when no one is looking.
-------------------------------------
You've achieved success in your field when you don't know whether what
you're doing is work or play
-------------------------------------
To achieve the impossible dream, try going to sleep.
-------------------------------------
Facts do not cease to exist because they are ignored.
-------------------------------------
Typing monkeys will write all Shakespeare's works in 200yrs.Will they write
all patents, too? :)
-------------------------------------
Sanity is madness put to good use.
-------------------------------------
I finally figured out the only reason to be alive is to enjoy it.

Current Thread