[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
Re: [xsl] Can a single XPath statement duplicate the functionality of this verbose
At 2011-10-23 17:10 -0700, Mark wrote:
Presuming you have only a single attribute (the name() function will abend if you have more than one), this may work for you ... it expresses a sequence and selects the first member of that sequence:
This relies on the XPath 2 behaviour of sequence ( (), x ) collapsing to ( x ).
Note the use of current() to return the node that was current at the start of evaluating the XPath expression (also available in XPath 1).
I hope this helps.
. . . . . . . . . Ken
Re: [xsl] Can a single XPath statement duplicate the functionality of this verbose statement?
Subject: Re: [xsl] Can a single XPath statement duplicate the functionality of this verbose <xsl:choose> statement? From: "G. Ken Holman" <gkholman@xxxxxxxxxxxxxxxxxxxx> Date: Sun, 23 Oct 2011 20:18:05 -0400 |
At 2011-10-23 17:10 -0700, Mark wrote:
Although they do have the virtue of giving me my desired output, can the following sequence of statements be replaced by a more generalized (shorter and simpler) XPath statement without the repetitive "when" tests shown below?
<xsl:choose>
<xsl:when test="@souvenir-sheet">
<xsl:copy-of select="if (../Location/@souvenir-sheet) then ../Location/@souvenir-sheet else if (../Location/@denomination) then ../Location/@denomination else '0' "/>
</xsl:when>
<xsl:when test="@minisheet">
<xsl:copy-of select="if(../Location/@minisheet) then ../Location/@minisheet else if(../Location/@denomination) then ../Location/@denomination else '0'"/>
</xsl:when>
<xsl:when test="@booklet">
<xsl:copy-of select="if(../Location/@booklet) then ../Location/@booklet else if(../Location/@denomination) then ../Location/@denomination else '0'"/>
</xsl:when>
<xsl:when test="@se-tenant">
<xsl:copy-of select="if (../Location/@se-tenant) then ../Location/@se-tenant else if(../Location/@denomination) then ../Location/@denomination else '0'"/>
</xsl:when>
<xsl:when test="@coupon">
<xsl:copy-of select=" if (../Location/@coupon) then ../Location/@coupon else if(../Location/@denomination) then ../Location/@denomination else '0'"/>
</xsl:when>
</xsl:choose>
My XPath is very weak.
I tried:
<xsl:copy-of select="if (../Location[name(@*)=name(@*)]) then ../Location/@* else if(../Location/@denomination) then ../Location/@denomination else '0'"></xsl:copy-of>
Presuming you have only a single attribute (the name() function will abend if you have more than one), this may work for you ... it expresses a sequence and selects the first member of that sequence:
<xsl:copy select="( ../Location[name(@*)=name(current()/@*)] , ../Location/@denomination , '0' )[1]"/>
This relies on the XPath 2 behaviour of sequence ( (), x ) collapsing to ( x ).
Note the use of current() to return the node that was current at the start of evaluating the XPath expression (also available in XPath 1).
I hope this helps.
. . . . . . . . . Ken
-- Contact us for world-wide XML consulting and instructor-led training Crane Softwrights Ltd. http://www.CraneSoftwrights.com/s/ G. Ken Holman mailto:gkholman@xxxxxxxxxxxxxxxxxxxx Google+ profile: https://plus.google.com/116832879756988317389/about Legal business disclaimers: http://www.CraneSoftwrights.com/legal
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Can a single XPath statement , Mark | Thread | Re: [xsl] Can a single XPath statem, G. Ken Holman |
[xsl] Can a single XPath statement , Mark | Date | Re: [xsl] Can a single XPath statem, G. Ken Holman |
Month |