xsl-list
[Top] [All Lists]

Re: [xsl] Brain Teaser

2007-09-17 00:12:10
This one has turned out to be beyond me - sorry I can't help...
When you get hold of your solution, I'd like to see it....

        # r

Owens, Stephen P wrote:
I have a problem in XSLT that I simply do not know how to solve. 

Perhaps someone smarter than me can show their stuff.

Suppose you have a document such as the following:

<root>
   <section type="foo">
      <a>Text 1</a>
      <a type="bar">Mixed Content
         <b type="foo">Text 2</b>
         <b>Mixed Content
              <c>Text 3</c>
              <c type="bar">Text 4</c>
         </b>
      </a>
   </section>
</root>

The root tag can contain any number of section type tags.  Section and single 
letter tags a-z support the type attribute which can be any string value.
Further suppose that the schema allows section tags to contain any single 
letter tag a-z. Also any single letter tag a-z may contain any combination 
and number of single letter tags a-z. All single letter tags support mixed 
content as well.

How is it possible using XSLT to convert the document to one such as the 
following.

<root>
   <type name="foo">
      <section type="foo" tag-id="001">
         <a tag-id="002">Text 1</a>
      </section>
   </type>
   <type name="bar">
      <section tag-cont="001">
         <a tag-cont="002">
            <b tag-id="003">Text 2</b>
            <b tag-id="004">Mixed Content
                <c>Text 3</c>
            </b>
         </a>
      </section>
   </type>
   <type name="foo">
      <section tag-cont="001">
         <a tag-cont="002">
            <b tag-cont="004">
                <c tag-id="005">Text 4</c>
            </b>
         </a>
      </section>
   </type>
</root>

The idea is that wherever a tag appears with a type attribute in the source 
document, that tag and the tags that follow appear in a well formed structure 
wrapped by a "type" tag in the target document, thus whenever a new type 
attribute is encountered on a tag, we close everything up to a pre-determined 
certain stopping point somewhere before the top such as the child of root in 
this case, and then we re-open duplicates of everything, and continue on with 
the processing.

Examining the above source and target example should give you a clearer idea. 
 Also, for anything we re-open from the previous we tie to the previous as a 
continuation by adding an tag-id attribute to the original tag, and a 
tag-cont attribute to the subsequent continuation.

I think it is fairly trivial to write a transform that goes from the latter 
to the former, but I can think of no way to go from the former to the latter. 

For those of you thinking this is a trivial exercise consider the real world 
application of translating DocBook XML or similar schemas into XSL-FO.

Anyone out there up for a challenge?


----------------------------------------------------------------------
LEGAL NOTICE
Unless expressly stated otherwise, this message is confidential and may be 
privileged.  It is intended for the addressee(s) only.  Access to this E-mail 
by anyone else is unauthorized.  If you are not an addressee, any disclosure 
or copying of the contents of this E-mail or any action taken (or not taken) 
in reliance on it is unauthorized and may be unlawful.  If you are not an 
addressee, please inform the sender immediately.

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--




-- 
Ronan Klyne
Business Collaborator Developer
Tel: +44 (0)870 163 2555
ronan(_dot_)klyne(_at_)groupbc(_dot_)com
www.groupbc.com

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>