xsl-list
[Top] [All Lists]

Re: [xsl] Best Way to Select Following Elements With An Ancestor?

2014-03-22 17:58:47
I suspect that something like this might be quite efficient (using
keys) in the case the search is performed for more than one descendant
of a subtree top-node:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:key name="kDescendants" match="computer//*"
           use="generate-id(ancestor::computer[1])"/>
 <xsl:template match="/*">
  <xsl:apply-templates select="computer[2]/motherboard"/>
 </xsl:template>

 <xsl:template match="computer[2]/motherboard">
  <xsl:sequence select=
  "key('kDescendants', generate-id(ancestor::computer[1]))

 [. >> current()]"/>
 </xsl:template>
</xsl:stylesheet>


When the transformation is applied on the following XML document (none
was originally provided):

<computers>
 <computer>
  <cpu ghz="3.5" unlocked="Yes">Intel i7 3770k</cpu>
  <motherboard>MSI M-Power</motherboard>
  <ram>8</ram>
  <storage>
   <hdd>1000</hdd>
   <ssd>128</ssd>
  </storage>
  <gpu group="ATI">7950</gpu>
  <psu>750</psu>
 </computer>
 <computer>
  <cpu ghz="3.5" unlocked="Yes">Intel i5 3570k</cpu>
  <motherboard>ASRock Extreme 4</motherboard>
  <ram>8</ram>
  <storage>
   <hdd>1000</hdd>
  </storage>
  <gpu group="ATI">7870</gpu>
  <psu>600</psu>
 </computer>
 <computer>
  <cpu ghz="3.5" unlocked="No">Intel i5 3550</cpu>
  <motherboard>ASRock Extreme 3</motherboard>
  <ram>8</ram>
  <storage>
   <hdd>500</hdd>
  </storage>
  <gpu group="GeForce">9600GT</gpu>
  <psu>500</psu>
 </computer>
</computers>

we get exactly the wanted result:

<ram>8</ram>
<storage>
   <hdd>1000</hdd>
  </storage>
<hdd>1000</hdd>
<gpu group="ATI">7870</gpu>
<psu>600</psu>


On Sat, Mar 22, 2014 at 5:46 AM, Eliot Kimber <ekimber(_at_)contrext(_dot_)com> 
wrote:
I have a document where each child of the root element establishes a
unique content with regard to the output result (in this case,
corresponding to InDesign frames).

For a given descendant of one of these elements I need to know if there
are any following elements within the same context. So simply doing
following::* won't work and the following elements I'm checking for need
not be siblings of the current element.

The solution I arrived at is:

<xsl:variable name="myDitaAncestor" select="ancestor::dita"
as="element()*"/>

    <xsl:variable name="followingWithinDita" as="element()*"
  select="following::*[count(ancestor::dita | $myDitaAncestor) = 1]"
    />

This works but I'm wondering if there's a better solution, either one that
is more efficient or one that is more elegant?


Thanks,

Eliot
—————
Eliot Kimber, Owner
Contrext, LLC
http://contrext.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>
--~--




-- 
Cheers,
Dimitre Novatchev
---------------------------------------
Truly great madness cannot be achieved without significant intelligence.
---------------------------------------
To invent, you need a good imagination and a pile of junk
-------------------------------------
Never fight an inanimate object
-------------------------------------
To avoid situations in which you might make mistakes may be the
biggest mistake of all
------------------------------------
Quality means doing it right when no one is looking.
-------------------------------------
You've achieved success in your field when you don't know whether what
you're doing is work or play
-------------------------------------
To achieve the impossible dream, try going to sleep.
-------------------------------------
Facts do not cease to exist because they are ignored.
-------------------------------------
Typing monkeys will write all Shakespeare's works in 200yrs.Will they
write all patents, too? :)
-------------------------------------
I finally figured out the only reason to be alive is to enjoy it.

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