Re: [xsl] match string

Subject: Re: [xsl] match string
From: Anton Triest <anton@xxxxxxxx>
Date: Wed, 20 Oct 2004 14:39:37 +0200
Zsolt Szabs wrote:

I have modified my template, because like you said I had lost the markup in para[1]

1.
<xsl:template match="chapter/section[1]/para[1]/*[1]/text()[1]" priority="1">


2.
<xsl:template match="para">

but now the output of the first paragraph looks like>
<p> <p> <b> Three words are </b> here </p> </p>

it is because I have a template for the first paragraphs first tag text()
and a template for every paragraph, with matches para[1] too

Yes (like David says): in the template matching text() you don't need a p element node anymore.



how can I solve this problem?


On Oct 19, 2004, at 3:04 PM, David Carlisle wrote:

Also, in this case you probably want to match on the first text node of
the first para rather than the para itself as in

<xsl:template match="chapter/section[1]/para[1]//text()[1]" priority="1">

As you have it, you are doing string operations on the entire paragraph
text which means that any element markup within the paragraph will be
lost.

There's another problem. I thought "//text()[1]" would give "the first text node (inside that first paragraph) however deeply nested in any markup". But instead, it seems to return the first text node of *all* the nested markup. Example:

<input>
<para>A paragraph without any markup</para>
<para>A paragraph with some <i>markup</i> inside</para>
<para>A paragraph with some <b><i>nested</i> markup</b></para>
<para><em>This is a special case</em>: paragraph starts with markup</para>
<para><em>This</em> is difficult: only the first word has markup</para>
</input>


<output>
<para><first>A paragraph without </first>any markup</para>
<para><first>A paragraph with </first>some<i><first>markup</first></i> inside</para>
<para><first>A paragraph with </first>some<b><i><first>nested</first></i><first>markup</first></b></para>
<para><em><first>This is a </first>special case</em><first>: paragraph starts </first>with markup</para>
<para><em><first>This</first></em><first>is difficult: only </first>the first word has markup</para>
</output>


Zsolt, I see that you changed this to "/*[1]/text()[1]" but that gives

<output>
<para>A paragraph without any markup</para>
<para>A paragraph with some <i><first>markup</first></i> inside</para>
<para>A paragraph with some <b><i>nested</i><first>markup</first></b></para>
<para><em><first>This is a </first>special case</em>: paragraph starts with markup</para>
<para><em><first>This</first></em> is difficult: only the first word has markup</para>
</output>


your solution works, but it is to complicated for me. I need time to exactly understand it.

Don't worry Zsolt, it's getting complicated for me too! :-) It think I also need some time to work this out


Best regards
Anton

Current Thread