xsl-list
[Top] [All Lists]

RE: XSL Problem

2004-08-11 00:34:30
You can select the first NatureInterestCd = LIEN, using the predicate

AdditionalInterestInfo[NatureInterestCD='LIEN'][1]

In XPath 2.0 you can then exclude this from your result set by using the
"except" operator, and similarly for the other exclusions.

It's harder to do "A except B" in XPath 1.0: EXSLT offers a set:difference()
extension function, or you can use logic based on generate-id() or on the
formula

A[count(.|B) != count(B)]

Alternatively, you can use a predicate such as

AdditionalInterestInfo[not(NatureInterestCD='LIEN' and
not(preceding-sibling::*[NatureInterestCD='LIEN']))]

Michael Kay 

-----Original Message-----
From: Dale Earnest 
[mailto:dale(_dot_)earnest(_at_)backbaytechnologies(_dot_)com] 
Sent: 11 August 2004 01:01
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] XSL Problem

I've run into a difficult xslt problem and I was hoping 
someone may have some insight.
 
I have an XML structure that looks like this (the '...'s 
represent nodes that aren't directly relevant to the question 
and are omitted):
 
<PersAutoInsurance>
 <PersVeh>
  ...
  <AdditionalInterest>
    <AdditionalInterestInfo>
    <NatureInterestCd>ADDIN</NatureInterestCd>
   </AdditionalInterestInfo>
  </AdditionalInterest>
  <AdditionalInterest>
   ...
   <AdditionalInterestInfo>
    <NatureInterestCd>LIEN</NatureInterestCd>
   </AdditionalInterestInfo>
  </AdditionalInterest>
  <AdditionalInterest>
   ...
   <AdditionalInterestInfo>
    <NatureInterestCd>LIEN</NatureInterestCd>
   </AdditionalInterestInfo>
  </AdditionalInterest>
 </PersVeh>
 <PersVeh>
  <AdditionalInterest>
   ...
   <AdditionalInterestInfo>
    <NatureInterestCd>ADDIN</NatureInterestCd>
   </AdditionalInterestInfo>
  </AdditionalInterest>
  <AdditionalInterest>
   ...
   <AdditionalInterestInfo>
    <NatureInterestCd>LIEN</NatureInterestCd>
   </AdditionalInterestInfo>
  </AdditionalInterest>
  <AdditionalInterest>
   ...
   <AdditionalInterestInfo>
    <NatureInterestCd>AIL</NatureInterestCd>
   </AdditionalInterestInfo>
  </AdditionalInterest>
 </PersVeh>
</PersAutoInsurance>
 
What I'm trying to do is select NatureInterestCd's based on 
the following criteria:
1) I cannot accept the first NatureInterestCd = LIEN for each 
vehicle (but may accept any subsequent for processing)
2) I cannot accept the first NatureInterestCd = AIL for each 
vehicle (but may accept any subsequent for processing)
2) I can accept any other node
 
I attempted to use this type of statement to get the nodes 
and loop over them:
<xsl:for-each 
select="PersAutoInsurance/PersVeh/AdditionalInterest/Additiona
lInterestInfo[not(NatureInterestCd = 'LIEN') and 
not(NatureInterestCd = 'AIL')]">
 
But that eliminates all nodes, not simply the first.  I tried 
adding in a position() qualifier, but that ended up only 
checking the first node in the whole node-set selected.
 
I tried 
generate-id(PersAutoInsurance/PersVeh[1]/AdditionalInterest/Ad
ditionalInterestInfo[NatureInterestCd = 'LIEN'][1]) as that XPATH returns
the LIEN I don't > want (I had to use it in another part of the xsl), but
the ID 
it generated wasn't the same as the ID that was being 
generated when I looped over the all the NatureInterestCd's, 
so I couldn't eliminate the node based on that.
 
I'm nearing my wits end on this problem and I was hoping that 
someone could give some insight into this problem.
 
Dale Earnest
 

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




<Prev in Thread] Current Thread [Next in Thread>