xsl-list
[Top] [All Lists]

RE: [xsl] Problem with Xpath

2006-12-13 16:41:18
You are still describing your output instead of showing it. Please don't ask me 
to decipher your description in order to re-create what the output should look 
like. Please send an example (NOT a description) of the output. That means I 
want to see XML, not:
=====================================
1. First level
  A. some text
2. Second level

That is, the style sheet formats these levels 1 thru 6
with the following 1, A, (1), (a), 1) , a)

So if l3's conditions match, then it should be counted
as level 2 and not as level3. Hence level 3 should
have 'A.' and not (1).

But the actual output is:
1. First level
    (1) some text
2. Second level

Also, if suppose the parameters are chnged to Target
and Pen, then the desired output is:

1. Second level
================================

So, try again. Send examples of the XML you now get and the XML you want to get 
and I'll take a crack at it.
-- 
Charles Knell
cknell(_at_)onebox(_dot_)com - email



-----Original Message-----
From:     ms <mina_hurray(_at_)yahoo(_dot_)com>
Sent:     Wed, 13 Dec 2006 14:10:28 -0800 (PST)
To:       xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject:  RE: RE: [xsl] Problem with Xpath

Thanks a lot for your help so far.
The XML looks like this:
<root>

<l1>
                        <text>
                                <para>First level</para>
                        </text>
                        <info>
                                <comp>Kmart</comp>
                                <prod>Shoes</prod>
                        </info>
                        <l2>
                        <text>
                                <para>Second level .</para>
                        </text>
<l3>
<text>
                                <para>some text</para>
                        </text>
                        <info>
                                <comp>Kmart</comp>
                                <prod>Shoes</prod>
                        </info>

</l3>
                        </l2>
                </l1>
                <l1>
                        <text>
                                <para>Second level</para>
                                <info>
                                <comp>Kmart</comp>
                                <prod>Shoes</prod>
                        </info>
                        </text>
                </l1>
                        <l1>
                        <text>
                                <para>Third level</para>
                                <info>
                                <comp>Target</comp>
                                <prod>Pen</prod>
                        </info>
                        </text>
                </l1>
</root>

I am passing the parameters company and product to the
style sheet. If company=Kmart and product = SHoes the
output should be:


1. First level
  A. some text
2. Second level

That is, the style sheet formats these levels 1 thru 6
with the following 1, A, (1), (a), 1) , a)

So if l3's conditions match, then it should be counted
as level 2 and not as level3. Hence level 3 should
have 'A.' and not (1).

But the actual output is:
1. First level
    (1) some text
2. Second level

Also, if suppose the parameters are chnged to Target
and Pen, then the desired output is:

1. Second level

Instead, I now get,

2. Second level

The XSLT is:

<xsl:template match="l1">
<xsl:choose>
                        <xsl:when test=".//info">
                                <xsl:if test=".//info/company=$company and
.//info/product=$product">
                                        <fo:list-block>
                                                <fo:list-item>
                                                        <fo:list-item-label>
                                                                <fo:block>
                                                                        
<xsl:number format="1"/>
                                                                </fo:block>
                                                        </fo:list-item-label>
                                                        <fo:list-item-body>
                                                                <fo:block>
                                                                        
<xsl:apply-templates/>
                                                                </fo:block>
                                                        </fo:list-item-body>
                                                </fo:list-item>
                                        </fo:list-block>
                                </xsl:if>
                        </xsl:when>
                        <xsl:otherwise>
                        <!-- Do something else-->
                        </xsl:otherwise>
                </xsl:choose>
        </xsl:template>

This template repeats for all 6 levels. 


--- cknell(_at_)onebox(_dot_)com wrote:

<xsl:number> is probably a false friend in this
situation. I have a notion of what you need to do,
but it will be much easier to help if you post an
example (as opposed to the description you gave) of
what the output you are now getting looks like, and
a second example of the output you would like to
get.
-- 
Charles Knell
cknell(_at_)onebox(_dot_)com - email



-----Original Message-----
From:     ms <mina_hurray(_at_)yahoo(_dot_)com>
Sent:     Wed, 13 Dec 2006 11:45:34 -0800 (PST)
To:       xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject:  RE: [xsl] Problem with Xpath

Thank you the .//info worked. But I guess I have a
new
problem now, since there is some styling to format
these levels as 1, 2, 3 etc, now if the second<l1>
tag
matched then the numbering starts with 2. instead of
1. 

Is there any way to start this numebring at 1
instead
of 2 so that even in between if there are levels
that
have to be missed the numbering stays as 1,2 , 3 and
not 2, 5, ,6 etc.

Please let me know.



--- cknell(_at_)onebox(_dot_)com wrote:

Your example XML file does not contain elements
with
the local names "company" and "product". Your XSLT
file is looking for them. Naturally it won't find
them, so the transformation will fail.

This: <xsl:when test="//info">
and this: <xsl:if test="//info/company=$company
and
//info/product=$product">

are telling your stylesheet to start looking at
the
root for elements matching the test criteria.

Is that what you want? Or, do you want to look for
"info" elements that are descendants of the "l1"
element?

Since the latter makes sense to me and the former
does not, maybe the XPath expression you are
looking
for is 

<xsl:when test=".//info">
and <xsl:if test=".//info/company=$company and
.//info/product=$product">


N.B., there is a period character before the
double-slash. That tells your stylesheet to start
at
the context node (<l1>, in this case) and not at
the
document root.

Get the element names correct and try these XPath
expressions, and get back to us if you are still
having a problem.

-- 
Charles Knell
cknell(_at_)onebox(_dot_)com - email



-----Original Message-----
From:     ms <mina_hurray(_at_)yahoo(_dot_)com>
Sent:     Wed, 13 Dec 2006 10:39:01 -0800 (PST)
To:       xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject:  [xsl] Problem with Xpath

Hi all:

I am having issues with Xpath. 

My xml looks like this:

<root>

<l1>
                    <text>
                            <para>First level</para>
                    </text>
                    <info>
                            <comp>Kmart</comp>
                            <prod>Shoes</prod>
                    </info>
                    <l2>
                    <text>
                            <para>Second level .</para>
                    </text>
                    </l2>
            </l1>
            <l1>
                    <text>
                            <para>Second level</para>
                            <info>
                            <comp>Kmart</comp>
                            <prod>Shoes</prod>
                    </info>
                    </text>
            </l1>
                    <l1>
                    <text>
                            <para>Third level</para>
                            <info>
                            <comp>Target</comp>
                            <prod>Pen</prod>
                    </info>
                    </text>
            </l1>
</root>

Now, I have logic in my style sheet which says
that
only if element <l1> contains element <info>, then
if <comp> and <prod> values match the values being
passed to the style sheet through two other
parameters
<company> and <product> , then display l1 ,
otherwise
do not display l1.

The XSLT is :


<xsl:template match="l1">
<xsl:choose>
                    <xsl:when test="//info">
                            <xsl:if test="//info/company=$company and
//info/product=$product">
                                    <fo:list-block>
                                            <fo:list-item>
                                                    <fo:list-item-label>
                                                            <fo:block>
                                                                    
<xsl:number format="1"/>
                                                            </fo:block>
                                                    </fo:list-item-label>
                                                    <fo:list-item-body>
                                                            <fo:block>
                                                                    
<xsl:apply-templates/>
                                                            </fo:block>
                                                    </fo:list-item-body>
                                            </fo:list-item>
                                    </fo:list-block>
                            </xsl:if>
                    </xsl:when>
                    <xsl:otherwise>
                    <!-- Do something else-->
                    </xsl:otherwise>
            </xsl:choose>
    </xsl:template>

So, if I have passed $company="KMart" and
$product="Shoes" on the style sheet, then the
expected
output is:

1 First
2 Second

Instead, it matches only the company and product
for
the first level and stops there. Can you please
tell
me what is wrong with the xpath to company and
product
on the style sheet?

Thank you in advance for your help. 




 


____________________________________________________________________________________
Do you Yahoo!?
Everyone is raving about the all-new Yahoo! Mail
beta.

=== message truncated == 


 
____________________________________________________________________________________
Have a burning question?  
Go to www.Answers.yahoo.com and get answers from real people who know.

--~------------------------------------------------------------------
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>
--~--




--~------------------------------------------------------------------
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>
--~--