Wrox Programmer Forums
Go Back   Wrox Programmer Forums > XML > XSLT
| Search | Today's Posts | Mark Forums Read
XSLT General questions and answers about XSLT. For issues strictly specific to the book XSLT 1.1 Programmers Reference, please post to that forum instead.
Welcome to the p2p.wrox.com Forums.

You are currently viewing the XSLT section of the Wrox Programmer to Programmer discussions. This is a community of software programmers and website developers including Wrox book authors and readers. New member registration was closed in 2019. New posts were shut off and the site was archived into this static format as of October 1, 2020. If you require technical support for a Wrox book please contact http://hub.wiley.com
 
Old August 17th, 2003, 04:09 PM
Authorized User
 
Join Date: Aug 2003
Location: Vienna, , Austria.
Posts: 11
Thanks: 0
Thanked 0 Times in 0 Posts
Default Word Bulleted Paragraphs to HTML Unordered Lists

Hi there

I guess I'm still a bloody beginner with xslt :-((


I've got HTML files originally saved from a MS Word document and then converted to XHTML.

For that what looks like a Bulleted List Word uses paragraphs with a style that adds bullet and indentation, but no structure around that.

With (x)HTML of course I want to use the UL construct with LI elements around those "paragraphs". So the question is how to convert that (at first just simple lists, no interspersed "ListContinue" paragraphs or indented tables or whatever you can imagine).


With my XSL transformation I encounter the problem that I cannot "separate" consecutive bulleted paragraphs (1.1, 1.2, 1.3), that should build up a single UL element, from other bulleted paragraphs (2.1, 2.2, 2.3, 2.4) that may follow later in the document, and vice versa.

(Until now, because I couldn't solve the first problem, I didn't try to solve the next one with the interspersed list of level 2, for which I also need a solution)

Here an example:

<p class="Normal">some normal paragraph text</p>
<p class="ListBullet">-1.1- list level 1 item</p>
<p class="ListBullet">-1.2- list level 1 item</p>
<p class="ListBullet">-1.3- list level 1 item</p>
<p class="Normal">-- this is normal paragraph that breaks the list items into two parts, 1.* and 2.* --</p>
<p class="ListBullet">-2.1- list level 1 item</p>
<p class="ListBullet">-2.2- list level 1 item</p>
<p class="Normal">some normal paragraph text</p>

I wrote an xsl stylesheet (generally using match+mode templates where possible) which deals with copying the XHTML document element by element, doing special things on some elements (like table attributes [not shown here], and bulleted paragraphs).

When it comes to the bulleted paragraphs I'm "experimenting" with these 3 templates; the first matching the first list item, and the second being called to do the rest (but this one doesn't work).

Note: "&lt;" should be read as "<"

<xsl:template match="p[@class='ListBullet'] [preceding-sibling::*[1]/@class!='ListBullet'] " mode="copy">
  &lt;ul>
    &lt;li>
      <xsl:copy>
        <xsl:for-each select="./@*" >
          <xsl:attribute name="{name()}">
            <xsl:value-of select="." />
          </xsl:attribute>
        </xsl:for-each>
        <xsl:apply-templates mode="copy" />
      </xsl:copy>
    &lt;/li>
    <xsl:call-template name="remaining-LIs" />
  &lt;/ul>
</xsl:template>

<xsl:template name="remaining-LIs">
  <xsl:for-each select="../p[@class='ListBullet'] [preceding-sibling::*[1]/@class='ListBullet']">
    &lt;li>
    <xsl:copy>
      <xsl:for-each select="./@*" >
        <xsl:attribute name="{name()}">
          <xsl:value-of select="." />
        </xsl:attribute>
      </xsl:for-each>
      <xsl:apply-templates mode="copy" />
    </xsl:copy>
    &lt;/li>
  </xsl:for-each>
</xsl:template>

<xsl:template match="p[@class='ListBullet'] [preceding-sibling::*[1]/@class='ListBullet']" mode="copy">



</xsl:template>

The result I get looks like that ("*" to show a bullet):

some normal paragraph text
  * -1.1- list level 1 item
  * -1.2- list level 1 item
  * -1.3- list level 1 item
  * -2.2- list level 1 item
-- this is normal paragraph that breaks ...
  * -2.1- list level 1 item
  * -1.2- list level 1 item
  * -1.3- list level 1 item
  * -2.2- list level 1 item
some normal paragraph text

I understand why I get the unwanted 2.2, and 1.2 and 1.3, respectively, but I have no idea how to get rid of them.

How can I express (using predicates) that the first "for-each" in "remaining-LIs" shall loop only over "neighbour elements" in the original document (1.3 and 2.1 and not neighbours)? I failed using position() for this, because this always refers to the current node - I would like to write something like the following, but of course that's wrong syntax:

  select="../p[@class='ListBullet']
    [preceding-sibling::*[1]/@class='ListBullet']
    [position(preceding-sibling::*[1])=position()-1]"

May be this "select" is, besides syntactically wrong, still a bad approach, because "remaining-LIs" has to start at the element following that one actually caught by the first (match) template.

Does anybody have an idea how to deal with the problem?

Thanx in advance,
George
 
Old August 17th, 2003, 11:49 PM
Authorized User
 
Join Date: Aug 2003
Location: Vienna, , Austria.
Posts: 11
Thanks: 0
Thanked 0 Times in 0 Posts
Default

After sleeping a couple of hours I have an idea how to solve the problem - not really smart, but it could do it:

I could do a two-pass transformation

(1) copy all elements, and for each paragraph, which should later become an LI of an UL, add an attribute whose value is the position of the paragraph
(2) do the real transformation, evaluating that attribute

I'm going to try it.

But: is there any smarter solution to the problem? :-)

Regards,
George
 
Old August 18th, 2003, 12:57 AM
Friend of Wrox
 
Join Date: Jun 2003
Location: Nor Hachin, Kotayk, Armenia.
Posts: 147
Thanks: 0
Thanked 0 Times in 0 Posts
Send a message via Yahoo to armmarti
Default

The problem you described is a classical "positional grouping" problem. I think the approach you chose is complicated, so I tried to present simpler solution in "rule-based" design pattern.

Besides that, since you have to perform something like identity transformation, this stylesheet achieves that too. And may be you'll need to change some points to exactly achieve your goal and if you'll have troubles with this stylesheet(if you need comments on some points, for example), let me know please.

The stylesheet assumes that the input is an XHTML document.

Code:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" method="html"/>
    <xsl:template match="/">
        <xsl:apply-templates mode="copy"/>
    </xsl:template>

    <xsl:template match="body" priority="1" mode="copy">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates select="p[@class != 'ListBullet' and following-sibling::p[1]/@class = 'ListBullet']  | *[not(self::p)]" mode="copy"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="p[@class != 'ListBullet' and following-sibling::p[1]/@class = 'ListBullet']" mode="copy" priority="1">
        <xsl:variable name="current-item" select="."/>
        <xsl:value-of select="."/><br/>
        [list]
            <xsl:apply-templates select="following-sibling::p[@class = 'ListBullet' and generate-id($current-item) = generate-id(preceding-sibling::p[@class != 'ListBullet'][1])]" mode="copy"/>
        </ul>
    </xsl:template>

    <xsl:template match="p[@class = 'ListBullet']" priority="1" mode="copy">
        <li>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates mode="copy"/>
        </li>
    </xsl:template>

    <xsl:template match="node() | @*" mode="copy" priority="0.1">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*" mode="copy"/> 
        </xsl:copy> 
    </xsl:template>
</xsl:stylesheet>
By the way, the snippet you wrote in your stylesheet:
Code:
     <xsl:for-each select="./@*" >
        <xsl:attribute name="{name()}">
          <xsl:value-of select="." />
        </xsl:attribute>
      </xsl:for-each>
is equivalent to

Code:
  <xsl:copy-of select="@*"/>
which is shorter.

Regards,
Armen
 
Old August 18th, 2003, 01:04 AM
Friend of Wrox
 
Join Date: Jun 2003
Location: Nor Hachin, Kotayk, Armenia.
Posts: 147
Thanks: 0
Thanked 0 Times in 0 Posts
Send a message via Yahoo to armmarti
Default

P.S. I assumed that the "p" elements (which represent the bullets) are children of "body" element, which is reflected in the template matching the "body" element.
Probably you need to change something there to be able to process any such sequence of "p" elements. It dependents on
the structure of your input XHTML.

Regards,
Armen
 
Old August 18th, 2003, 04:24 AM
Authorized User
 
Join Date: Aug 2003
Location: Vienna, , Austria.
Posts: 11
Thanks: 0
Thanked 0 Times in 0 Posts
Default

I need the (finally html, first xml) output to replace "original" htm files, produced by RoboHelp HTML from a Word doc import, in a way that the RoboHelp HTML Editor would "adopt" the files as if it had created them itself.

So I need, what usually is not needed in html, paragraph elements with a class attribute, as provided with the input, in UL and LI elements.


My first run of your xls revealed that it didn't copy some p nodes and/or attributes.

Input:

<?xml version="1.0" encoding="ISO-8859-1"?>

<?xml-stylesheet type="text/xsl" href="E:\Online Help HTM XML\Files\Armen Stylesheet.xsl" ?>
<html xmlns:v="urn:schemas-microsoft-com:vml">
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"/>
      <title>Something like a heading</title>
      <link type="text/css" rel="stylesheet" href="SAT-HtmlHelp.css"/>
   </head>
   <body lang="DE" link="blue" vlink="purple">
      &lt;h1>Something like a heading</h1>
      <p class="Normal">some normal paragraph text</p>
      <p class="ListBullet">-1.1- list level 1 item</p>
      <p class="ListBullet">-1.2- list level 1 item</p>
      <p class="ListBullet">-1.3- list level 1 item</p>
      <p class="Normal">This is normal paragraph that breaks the list items into two parts</p>
      <p class="ListBullet">-2.1- list level 1 item</p>
      <p class="ListBullet">-2.2- list level 1 item</p>
      <p class="Normal">some normal paragraph text</p>
   </body>
</html>

Output (xml instead of html):

<?xml version="1.0" encoding="UTF-16"?>

<?xml-stylesheet type="text/xsl" href="E:\Online Help HTM XML\Files\Armen Stylesheet.xsl" ?>
   <html xmlns:v="urn:schemas-microsoft-com:vml">
      <head>
         <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
         </meta>
         <title>Something like a heading</title>
         <link type="text/css" rel="stylesheet" href="SAT-HtmlHelp.css">
         </link>
      </head>
   <body lang="DE" link="blue" vlink="purple">
      &lt;h1>Something like a heading</h1><s>some normal paragraph text<br /></s>
      <p class="Normal">some normal paragraph text</p>
      &ul;ul>
         &li;li class="ListBullet"><p class="ListBullet">-1.1- list level 1 item</p></li>
         &li;li class="ListBullet"><p class="ListBullet">-1.2- list level 1 item</p></li>
         &li;li class="ListBullet"><p class="ListBullet">-1.3- list level 1 item</p></li>
      </ul>This is normal paragraph that breaks the list items into two parts<br />
      &li;ul>
         <li class="ListBullet"><p class="ListBullet">-2.1- list level 1 item</p></li>
         <li class="ListBullet"><p class="ListBullet">-2.2- list level 1 item</p></li>
      </ul>
      &li;p class="Normal">some normal paragraph text</p>
   </body>
</html>

Red is what is not as expected.
As you said, I'll have to change something with the processing of paragraph elements.

I must happily admit that the xls, at the critical points, did perfectly what it should do! :)

May I ask you later how to extend the your xls in order to correctly process interspersed level 2 lists (ListBullet2) and continue-paragraphs (ListContinue, ListContinue2)? If so, shall I do it in the forum or directly by email?


Best Regards,
George
 
Old August 18th, 2003, 05:19 AM
Friend of Wrox
 
Join Date: Jun 2003
Location: Nor Hachin, Kotayk, Armenia.
Posts: 147
Thanks: 0
Thanked 0 Times in 0 Posts
Send a message via Yahoo to armmarti
Default

Quote:
quote:Originally posted by schurli
 I need the (finally html, first xml) output to replace "original" htm files, produced by RoboHelp HTML from a Word doc import, in a way that the RoboHelp HTML Editor would "adopt" the files as if it had created them itself.

So I need, what usually is not needed in html, paragraph elements with a class attribute, as provided with the input, in UL and LI elements.


My first run of your xls revealed that it didn't copy some p nodes and/or attributes.

Input:

<?xml version="1.0" encoding="ISO-8859-1"?>

<?xml-stylesheet type="text/xsl" href="E:\Online Help HTM XML\Files\Armen Stylesheet.xsl" ?>
<html xmlns:v="urn:schemas-microsoft-com:vml">
   <head>
    Â Â <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"/>
    Â Â <title>Something like a heading</title>
    Â Â <link type="text/css" rel="stylesheet" href="SAT-HtmlHelp.css"/>
   </head>
   <body lang="DE" link="blue" vlink="purple">
    Â Â &lt;h1>Something like a heading</h1>
    Â Â <p class="Normal">some normal paragraph text</p>
    Â Â <p class="ListBullet">-1.1- list level 1 item</p>
    Â Â <p class="ListBullet">-1.2- list level 1 item</p>
    Â Â <p class="ListBullet">-1.3- list level 1 item</p>
    Â Â <p class="Normal">This is normal paragraph that breaks the list items into two parts</p>
    Â Â <p class="ListBullet">-2.1- list level 1 item</p>
    Â Â <p class="ListBullet">-2.2- list level 1 item</p>
    Â Â <p class="Normal">some normal paragraph text</p>
   </body>
</html>

Output (xml instead of html):

<?xml version="1.0" encoding="UTF-16"?>

<?xml-stylesheet type="text/xsl" href="E:\Online Help HTM XML\Files\Armen Stylesheet.xsl" ?>
   <html xmlns:v="urn:schemas-microsoft-com:vml">
    Â Â <head>
        Â <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
        Â </meta>
        Â <title>Something like a heading</title>
        Â <link type="text/css" rel="stylesheet" href="SAT-HtmlHelp.css">
        Â </link>
    Â Â </head>
   <body lang="DE" link="blue" vlink="purple">
    Â Â &lt;h1>Something like a heading</h1><s>some normal paragraph text<br /></s>
    Â Â <p class="Normal">some normal paragraph text</p>
    Â Â &ul;ul>
        Â &li;li class="ListBullet"><p class="ListBullet">-1.1- list level 1 item</p></li>
        Â &li;li class="ListBullet"><p class="ListBullet">-1.2- list level 1 item</p></li>
        Â &li;li class="ListBullet"><p class="ListBullet">-1.3- list level 1 item</p></li>
    Â Â </ul>This is normal paragraph that breaks the list items into two parts<br />
    Â Â &li;ul>
        Â <li class="ListBullet"><p class="ListBullet">-2.1- list level 1 item</p></li>
        Â <li class="ListBullet"><p class="ListBullet">-2.2- list level 1 item</p></li>
    Â Â </ul>
    Â Â &li;p class="Normal">some normal paragraph text</p>
   </body>
</html>

Red is what is not as expected.
Perhaps I didn't fully understand the details you mentioned...
However, with slight code-changes it must do what you expect I hope(and if still don't, let me now and we'll continue):
Code:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" method="xml"/>
    <xsl:template match="/">
        <xsl:apply-templates mode="copy"/>
    </xsl:template>

    <xsl:template match="body" priority="1" mode="copy">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates select="p[@class != 'ListBullet']  | *[not(self::p)]" mode="copy"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="p[@class != 'ListBullet']" mode="copy" priority="1">
        <xsl:variable name="current-item" select="."/>
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates mode="copy"/>            
        </xsl:copy>
        <xsl:if test="following-sibling::p[1]/@class = 'ListBullet'">
            [list]
                <xsl:apply-templates select="following-sibling::p[@class = 'ListBullet' and generate-id($current-item) = generate-id(preceding-sibling::p[@class != 'ListBullet'][1])]" mode="copy"/>
            </ul>
        </xsl:if>    
    </xsl:template>

    <xsl:template match="p[@class = 'ListBullet']" priority="1" mode="copy">
        <li>
            <xsl:copy-of select="@*"/>
            <xsl:copy>
                <xsl:copy-of select="@*"/>
                <xsl:apply-templates mode="copy"/>    
            </xsl:copy>
        </li>
    </xsl:template>

    <xsl:template match="node() | @*" mode="copy" priority="0.1">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*" mode="copy"/> 
        </xsl:copy> 
    </xsl:template>
</xsl:stylesheet>
Quote:
quote:
As you said, I'll have to change something with the processing of paragraph elements.
Actually I meant that the input XHTML may contain "p" elements which are not direct children of "body" element(and which will need some little code-changes).

Quote:
quote:
May I ask you later how to extend the your xls in order to correctly process interspersed level 2 lists (ListBullet2) and continue-paragraphs (ListContinue, ListContinue2)? If so, shall I do it in the forum or directly by email?
Yes of course, this is an open forum, and I think any question or problem arisen here must be discussed(and solved) entirely in the public domain. "Open source" paradigm is great thing!


Regards,
Armen
 
Old August 18th, 2003, 06:11 AM
Authorized User
 
Join Date: Aug 2003
Location: Vienna, , Austria.
Posts: 11
Thanks: 0
Thanked 0 Times in 0 Posts
Default

Quote:
quote:Originally posted by armmarti


[ ... ]


Yes of course, this is an open forum, and I think any question or problem arisen here must be discussed(and solved) entirely in the public domain. "Open source" paradigm is great thing!


Regards,
Armen
I would very much appreciate - and I think some other people here would also do - if you could take the time to "translate" the formal language of the templates into human language, so that I (we) can undoubtedly understand

(1) the strategy of using exactly these templates
(2) how the select and match expression do work exactly
(3) in what way you did change your approach (first template compared with the second one)


Thanx again
George
 
Old August 18th, 2003, 09:21 AM
Friend of Wrox
 
Join Date: Jun 2003
Location: Nor Hachin, Kotayk, Armenia.
Posts: 147
Thanks: 0
Thanked 0 Times in 0 Posts
Send a message via Yahoo to armmarti
Default

I risk here to be verbose... However, I'll try to answer.
Quote:
quote:
(1) the strategy of using exactly these templates
            Really it's not so easy for me to explain the strategy you ask. In short, since the main goal was to perform
            something like identity transformation (when a stylesheet fully copies the source XML document into output), I started with
            the generic template which performs deep-copy of the document(it's the last template, which has priority 0.1). Here its priorty is set to
            0.1 since I wanted to "override" this template by other templates, which, besides deep-copy, requires some other distinguished processing
            (and those templates have priority equal to 1). Then the specific templates were written for those specific elements.

Quote:
quote:
(2) how the select and match expression do work exactly
Ok, I'll supply comments to all templates which, I hope, will make things clearer.
Code:
            <!-- 
                This template is applied first. The template body says that all templates for the children of the document root must be applied in the
                "copy" mode. In result, template matching the "html" element will be applied(it's the only child of the document root). The processor will choose the generic template which I mentioned above(the last one). It'll start to deep-copy
                the document. The same(generic) template will be applied every time. The process will be stopped when "body" element will be encountered by the XSLT processor.
                Now there are 2 matching  templates: the second one(explicitly matches) and the last one(the generic template). Since the priority of the second(having match="body")
                is higher, it'll win(although according to XSLT spec, the same template would win if we would remove the "priority" attributes in both template-rules, I explicitly
                put the priority to make the code readable and for safety). 
             -->
            <xsl:template match="/">
                <xsl:apply-templates mode="copy"/>
            </xsl:template>

            <!--
                Now here we say: copy the "body" element, all its attributes, and apply templates for "group-header" paragraph children and also for all non-paragraph
                children. Here we prevent the XSLT processor to process the "bullet" paragraphs.
            -->
            <xsl:template match="body" priority="1" mode="copy">
                <xsl:copy>
                    <xsl:copy-of select="@*"/>
                    <xsl:apply-templates select="p[@class != 'ListBullet']  | *[not(self::p)]" mode="copy"/>
                </xsl:copy>
            </xsl:template>

            <!--
                This template is applied when "header-paragraph" element is encountered by the XSLT processor. In the body of the template, we
                copy the element along with its attributes and apply templates for children in the same mode of course. Then, if there are paragraph
                elements which are after this header-paragraph and which must be "bulletted", we output "ul" element and put in the content of that
                "ul" element the list of all such paragraph elements. Here the positional grouping is performed. The XPath expression selects all such paragraph elements
                which follow the current "header-paragraph" and "class" attribute of which equals to "ListBullet". generate-id() function is used here to recognize the current
                "header-paragraph"(i.e., we'll put in the list only paragraphs "associated" with the current "header-paragraph").
            -->
            <xsl:template match="p[@class != 'ListBullet']" mode="copy" priority="1">
                <xsl:variable name="current-item" select="."/>
                <xsl:copy>
                    <xsl:copy-of select="@*"/>
                    <xsl:apply-templates mode="copy"/>            
                </xsl:copy>
                <xsl:if test="following-sibling::p[1]/@class = 'ListBullet'">
                    [list]
                        <xsl:apply-templates select="following-sibling::p[@class = 'ListBullet' and generate-id($current-item) = generate-id(preceding-sibling::p[@class != 'ListBullet'][1])]" mode="copy"/>
                    </ul>
                </xsl:if>    
            </xsl:template>

            <!--
                The template is initiated for every "bulletted" paragraph element. We say here that we want to create "li" element(which becomes the "output destination"), copy all attributes of the current paragraph
                element(in result, new attribute for "li" will be created for each attribute of the current paragraph element), then deep-copy the element itself to the output destination.
            -->
            <xsl:template match="p[@class = 'ListBullet']" priority="1" mode="copy">
                <li>
                    <xsl:copy-of select="@*"/>
                    <xsl:copy>
                        <xsl:copy-of select="@*"/>
                        <xsl:apply-templates mode="copy"/>    
                    </xsl:copy>
                </li>
            </xsl:template>

            <!--
                The generic template which recursively performs the deep-copy of the document. If we'll remove all other templates, the stylesheet will
                perform an identity transformation(will copy the source XML doc into the output).             
            -->
            <xsl:template match="node() | @*" mode="copy" priority="0.1">
                <xsl:copy>
                    <xsl:apply-templates select="node() | @*" mode="copy"/> 
                </xsl:copy> 
            </xsl:template>
Quote:
quote:
(3) in what way you did change your approach (first template compared with the second one)
I don't understand this question fully. But I guess you mean the changes I made in the last stylesheet.
            I hope that after these comments it'll be clear what was changed(and why) to make the stylesheet to accomplish the job fully.


Regards,
Armen
 
Old August 18th, 2003, 03:50 PM
Authorized User
 
Join Date: Aug 2003
Location: Vienna, , Austria.
Posts: 11
Thanks: 0
Thanked 0 Times in 0 Posts
Default

Armen,

thank you very much for the detailed explanation of how the different templates work together, and how the priority attribute helps to control in a clear way which template is selected to be applied, if more than one would match.

I carefully read your "verbose" :) writing two times. Not everything is yet clear (I still have some questions). Tomorrow ('cause I started this thread in my free time from home) I want to discuss the templates and your explanation with a colleague of mine, and we will see if everything will be clear then. If not, you are in danger to read me once more here in the forum :):)


My question (3) which was not fully clear to you should address the fact (which till now I had hidden from you ), that also with the modified xls I could not get the desired result. So the meaning of the question was rather why did you change what: what changes did you make to the concept/strategy and why.

Doesn't matter, don't spend your time again on modifying the xls - the main things you got. Everything else should be more simple to accomplish (today I had not enough time to do it). Also, I have to integrate your templates in a stylesheet I made, which also shall do some other things than the bullets. So I cannot just "take" the templates and copy, I had to understand how (and why) they work.

And I had to understand WHAT they SHOULD DO (this is what I call "concept" or "strategy"), and not just that they do it and how.


After having written all that I feel that you ARE in danger :)

Best regards and greetings from Vienna,
George
 
Old August 20th, 2003, 04:49 PM
Authorized User
 
Join Date: Aug 2003
Location: Vienna, , Austria.
Posts: 11
Thanks: 0
Thanked 0 Times in 0 Posts
Default

Armen,

I have good news. Thanks to your help the problem is solved in time.

Later - but this not sure yet - I probably will have to deal with ListBullet paragraphs in table cells, with or without a preceding normal paragraph, and interspersed ListBullet2 paragraphs. This should be quite easy to accomplish.

This is not urgent.
Mentioning this does not mean to ask you for help on this now.

Best regards,
George




Similar Threads
Thread Thread Starter Forum Replies Last Post
HTML tags to automatically hang bulleted lines? cJeffreywang ASP.NET 2.0 Basics 1 February 6th, 2008 02:12 AM
bulleted list in grid view MunishBhatia ASP.NET 2.0 Basics 2 December 24th, 2007 04:26 AM
Grouping plain text into paragraphs igraham XSLT 4 July 16th, 2007 01:10 PM
Hierarchical HTML unordered lists from any XML knc XSLT 2 October 18th, 2006 11:43 AM
unordered elements in complex type mandabear XML 0 September 3rd, 2004 11:08 AM





Powered by vBulletin®
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Copyright (c) 2020 John Wiley & Sons, Inc.