xsl-list
[Top] [All Lists]

[xsl] Selecting non-duplicate nodes

2011-10-12 10:33:54
I posted a similar problem last week that required a somewhat more complex answer but received no responses to it, so I have reduced my requirements and simplified the problem substantially. My question now is: how can I change this stylesheet so that for the listed input, no <FormatButtons> in the output contains more than one copy of a <Format> with the same attribute name and value? That is, where the current output is, for example:

<FormatPage souvenir-sheet="365">
  <FormatButtons>
    <Formats se-tenant="365"/>
    <Formats se-tenant="365"/>
    <Formats coupon="367"/>
    <Formats coupon="368"/>
  </FormatButtons>
</FormatPage>

where the <Formats se-tenant="365" appears twice. What I desire is:

<FormatPage souvenir-sheet="365">
  <FormatButtons>
    <Formats se-tenant="365"/>
    <Formats coupon="367"/>
    <Formats coupon="368"/>
  </FormatButtons>
</FormatPage>

Thanks,
Mark
------------------------------------------------------
[Input file and stylesheet]
---------------------------------------------
<Input>
  <Set>
   <Stamp>
     <CatNumbers pofis-number="105"/>
     <Formats souvenir-sheet="105"/>
     <Formats se-tenant="105"/>
   </Stamp>
   <Stamp>
     <CatNumbers pofis-number="106"/>
     <Formats souvenir-sheet="105"/>
     <Formats se-tenant="105"/>
   </Stamp>
   <Stamp>
     <CatNumbers pofis-number="107"/>
     <Formats souvenir-sheet="105"/>
     <Formats se-tenant="107"/>
   </Stamp>
   <Stamp>
     <CatNumbers pofis-number="108"/>
     <Formats souvenir-sheet="105"/>
     <Formats se-tenant="107"/>
   </Stamp>
 </Set>
 <Set>
   <Stamp>
     <CatNumbers pofis-number="146"/>
     <Formats souvenir-sheet="146"/>
     <Formats se-tenant="146"/>
   </Stamp>
   <Stamp>
     <CatNumbers pofis-number="147"/>
     <Formats souvenir-sheet="146"/>
     <Formats se-tenant="146"/>
   </Stamp>
   <Stamp>
     <CatNumbers pofis-number="148"/>
     <Formats souvenir-sheet="146"/>
     <Formats se-tenant="146"/>
   </Stamp>
 </Set>
  <Set>
   <Stamp>
     <CatNumbers pofis-number="244"/>
     <Formats coupon="244"/>
   </Stamp>
   <Stamp>
     <CatNumbers pofis-number="245"/>
     <Formats souvenir-sheet="245"/>
   </Stamp>
 </Set>
 <Set>
   <Stamp>
     <CatNumbers pofis-number="365"/>
     <Formats souvenir-sheet="365"/>
     <Formats se-tenant="365"/>
   </Stamp>
   <Stamp>
     <CatNumbers pofis-number="366"/>
     <Formats souvenir-sheet="365"/>
     <Formats se-tenant="365"/>
   </Stamp>
   <Stamp>
     <CatNumbers pofis-number="367"/>
     <Formats souvenir-sheet="365"/>
     <Formats coupon="367"/>
   </Stamp>
   <Stamp>
     <CatNumbers pofis-number="368"/>
     <Formats souvenir-sheet="365"/>
     <Formats coupon="368"/>
   </Stamp>
 </Set>
</Input>

--------------------
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:xs="http://www.w3.org/2001/XMLSchema";
xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"; exclude-result-prefixes="xs
xd"
 version="2.0">

 <xsl:strip-space elements="*"/>
 <xsl:template match="Input">
   <xsl:element name="Output">
     <xsl:apply-templates/>
   </xsl:element>
 </xsl:template>

 <xsl:template match="Set">
   <!-- <xsl:apply-templates mode="stamp"/> -->
   <xsl:apply-templates mode="formats"/>
 </xsl:template>

 <xsl:template match="Stamp" mode="formats">
   <xsl:apply-templates mode="formats"/>
 </xsl:template>

 <xsl:template match="Formats" mode="formats">
   <xsl:if test="@* eq ../CatNumbers/@pofis-number">
     <xsl:element name="FormatPage">
       <xsl:copy-of select="@*"/>
       <xsl:variable name="format" select="name(@*)"/>
       <xsl:variable name="number" select="@*"/>
       <xsl:element name="FormatButtons">
         <xsl:for-each-group select="../../Stamp" group-by="Formats">
           <xsl:for-each select="current-group()">
             <xsl:if test="Formats/@*[name(.)=$format]=$number">
               <Formats>
                 <xsl:copy-of select="Formats/@*[not(name(.)=$format)]"/>
               </Formats>
             </xsl:if>
           </xsl:for-each>
         </xsl:for-each-group>
       </xsl:element>
     </xsl:element>
   </xsl:if>
 </xsl:template>

</xsl:stylesheet


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