[xsl] match first occurrence for which a condition holds true

Subject: [xsl] match first occurrence for which a condition holds true
From: "Robby Pelssers" <robby.pelssers@xxxxxxxxx>
Date: Thu, 6 Jan 2011 15:22:42 +0100
Hi David,

I made a mistake in that match pattern by trying to simplify the xml source.
I'm using xslt2.0 (saxon).

Here is original xml before transformation:

<LeafExtName id="Cap">
  <MaterialGroup id="Filler">
    <MatClassDess matgchild="0" id="Glass Fibrous" extchild="0">
      <MassPercent>30.35</MassPercent>
    </MatClassDess>
  </MaterialGroup>
  <MaterialGroup id="Flame retardant">
    <MatClassDess matgchild="0" id="Antimony trioxide (Sb2O3)" extchild="1">
      <MassPercent>30.35</MassPercent>>
    </MatClassDess>
  </MaterialGroup>
  <MaterialGroup id="Polymer">
    <MatClassDess matgchild="0" id="Polybutylene terephthalate" extchild="2">
      <MassPercent>20.50</MassPercent>
    </MatClassDess>
  </MaterialGroup>
  <MaterialGroup id="Pigment">
    <MatClassDess matgchild="0" id="Not disclosed by Subco." extchild="3">
      <MassPercent>08.80</MassPercent>
    </MatClassDess>
  </MaterialGroup>
</LeafExtName>

In my current xslt I have following which i think is the same as you proposed
but that does not work. See outcome below.

  <xsl:template
match="MassPercent[max(ancestor::LeafExtName/MaterialGroup/MatClassDess/MassP
ercent) = .][1]" mode="fixpercentages">
    <MassPercent>TODO</MassPercent>
  </xsl:template>

Result after transformation:

<LeafExtName id="Cap">
  <MaterialGroup id="Filler">
    <MatClassDess matgchild="0" id="Glass Fibrous" extchild="0">
      <MassPercent>TODO</MassPercent>
    </MatClassDess>
  </MaterialGroup>
  <MaterialGroup id="Flame retardant">
    <MatClassDess matgchild="0" id="Antimony trioxide (Sb2O3)" extchild="1">
      <MassPercent>TODO</MassPercent>>
    </MatClassDess>
  </MaterialGroup>
  <MaterialGroup id="Polymer">
    <MatClassDess matgchild="0" id="Polybutylene terephthalate" extchild="2">
      <MassPercent>20.50</MassPercent>
    </MatClassDess>
  </MaterialGroup>
  <MaterialGroup id="Pigment">
    <MatClassDess matgchild="0" id="Not disclosed by Subco." extchild="3">
      <MassPercent>08.80</MassPercent>
    </MatClassDess>
  </MaterialGroup>
</LeafExtName>

So adding [1] to the predicate does not work unfortunately.

Robby

Current Thread