| 
 
Subject: [xsl] Brain Teaser From: "Owens, Stephen P" <Stephen.P.Owens@xxxxxxxxxx> Date: Wed, 5 Sep 2007 14:54:02 -0400  | 
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.
| Current Thread | 
|---|
  | 
| <- Previous | Index | Next -> | 
|---|---|---|
| Re[2]: [xsl] W3C Schema for XSL-FO , Alexei Gagarinov | Thread | Re: [xsl] Brain Teaser, Ronan Klyne | 
| Re: [xsl] html as input to xslt, Lou Iorio | Date | [xsl] xsl with dynamic xpath statem, Ralph Price | 
| Month |