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

December 4th, 2014, 09:51 AM
|
|
Authorized User
|
|
Join Date: Apr 2013
Posts: 31
Thanks: 3
Thanked 0 Times in 0 Posts
|
|
match uncaught though declared in XSL
I've the below XML.
Code:
<para indent="no">
<star.page>18</star.page> Further to same.
</para>
and when i run the below XSLT.
Code:
<xsl:template match="para">
<xsl:value-of select="./node()[1][self::star.page]|./label/node()[1][self::star.page]"/>
<div>
<xsl:choose>
<xsl:when test="./@align">
<xsl:attribute name="class"><xsl:text>para align-</xsl:text><xsl:value-of select="./@align"/></xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="class"><xsl:text>para</xsl:text></xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:apply-templates/>
</div>
</xsl:template>
When i run this, instead of printing <div class="para">18</div>, it is printing <div class="para"></div>
please let me know where am i going wrong and how can i fix this.
Thanks :( :(
|
|

December 4th, 2014, 10:00 AM
|
 |
Friend of Wrox
|
|
Join Date: Aug 2007
Posts: 2,128
Thanks: 1
Thanked 189 Times in 188 Posts
|
|
When I run it it outputs:
Code:
<div class="para">
18 Further to same.
</div>
Therefore the issue is something about something you have not shown us, so we are unlikely to be able to help.
|
|

December 4th, 2014, 10:10 AM
|
|
Authorized User
|
|
Join Date: Apr 2013
Posts: 31
Thanks: 3
Thanked 0 Times in 0 Posts
|
|
Quote:
Originally Posted by samjudson
When I run it it outputs:
Code:
<div class="para">
18 Further to same.
</div>
Therefore the issue is something about something you have not shown us, so we are unlikely to be able to help.
|
Hi Samjudson,
Thanks for the reply, this is taking as a regular text. I've added a div to get this number inside it. and here is the demo .
http://xsltransform.net/eiZQaF5/1.
Here you can see the difference.
|
|

December 4th, 2014, 10:14 AM
|
 |
Friend of Wrox
|
|
Join Date: Aug 2007
Posts: 2,128
Thanks: 1
Thanked 189 Times in 188 Posts
|
|
No, That outputs exactly what I listed above, from what I can see.
You need to be a bit more specific in what output you are expecting I think, as we are clearly not understanding your requirements.
|
|

December 4th, 2014, 10:21 AM
|
|
Authorized User
|
|
Join Date: Apr 2013
Posts: 31
Thanks: 3
Thanked 0 Times in 0 Posts
|
|
Quote:
Originally Posted by samjudson
No, That outputs exactly what I listed above, from what I can see.
You need to be a bit more specific in what output you are expecting I think, as we are clearly not understanding your requirements.
|
First of all sorry for the entire confusion.
This is the final update, no more updates to my question, i mean i won't change it.
http://xsltransform.net/eiZQaF5/2
Here there is a div created <div class="x"> and the return value is <xsl:value-of select="./node()[1][self::star.page] or ./label/node()[1][self::star.page]"/>
Here the question is star.page is immediate child of para, so i think ./node()[1][self::star.page] is true, but the return value in <div class="x"> is false. I want to know where am i missing this part, i mean how to get this true
|
|

December 4th, 2014, 10:34 AM
|
 |
Friend of Wrox
|
|
Join Date: Aug 2007
Posts: 2,128
Thanks: 1
Thanked 189 Times in 188 Posts
|
|
So you don't want <div class="para">18</div> at all, you want 18<div class="para"></div>.
Try just using "*" instead of "node()". node() will match ANY node, including text nodes (of which a there will be three).
e.g. imagine your source xml looks like this:
Code:
<para indent="no"><text>
</text><star.page>18</star.page><text> Further to same.
</text></para>
So node() is matching that first text node, which just contains whitespace. "*" matches only child ELEMENTS, and a text node is not considered to be an element.
|
|

December 4th, 2014, 10:42 AM
|
|
Authorized User
|
|
Join Date: Apr 2013
Posts: 31
Thanks: 3
Thanked 0 Times in 0 Posts
|
|
Quote:
Originally Posted by samjudson
So you don't want <div class="para">18</div> at all, you want 18<div class="para"></div>.
Try just using "*" instead of "node()". node() will match ANY node, including text nodes (of which a there will be three).
e.g. imagine your source xml looks like this:
Code:
<para indent="no"><text>
</text><star.page>18</star.page><text> Further to same.
</text></para>
So node() is matching that first text node, which just contains whitespace. "*" matches only child ELEMENTS, and a text node is not considered to be an element.
|
Here starts the actual confusion.
with your suggestion(which i've tried previously), please have a look at this
http://xsltransform.net/gWmuiJ7
here if i use <xsl:apply-templates select="./*[1][self::star.page]" mode="first"/>, the output has a duplication(this is an error).
And if i use <xsl:apply-templates select="./node()[1][self::star.page]" mode="first"/>, the output that i get is what is required.(if i change * to node()).
|
|

December 4th, 2014, 12:28 PM
|
 |
Friend of Wrox
|
|
Join Date: Aug 2007
Posts: 2,128
Thanks: 1
Thanked 189 Times in 188 Posts
|
|
That is really ugly code. Use of disable-output-encoding and lots of html inside CDATA usually means you are trying to use XSLT in a way XSLT is not designed to be used.
It is not clear at all from the link you provide what you are attempting to do, especially as the HTML you are outputting is not actually valid XML any more (no <body> element, the </head> is followed by a <a> which is then followed by a closing </span> element?)
Your inclusion of process-instructions leads me to believe you want a machine to be able to process this output, therefore you need to consider what you are actually generating above carefully.
You need to get this down to the bare minimum that illustrates your basic requirements, so that we can easily reproduce the issue at our end and also provide the exact output you are expecting to see.
|
|
 |