Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Apr 28th, 2012  |  syntax: None  |  size: 4.38 KB  |  hits: 15  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. XSLT: How to select elements that are unique to an ancestor (not the root)?
  2. <Package>
  3.   <Single>
  4.     <Patient>
  5.       <Drug>
  6.         <Name>A</Name>
  7.         <Dose>1 tab</Dose>
  8.       </Drug>
  9.       <Drug>
  10.         <Name>B</Name>
  11.         <Dose>2 spoonfuls</Dose>
  12.       </Drug>
  13.     </Patient>
  14.   </Single>
  15.   <Multi>
  16.     <Patient>
  17.       <Drug>
  18.         <Name>A</Name>
  19.         <Dose>1 tab</Dose>
  20.       </Drug>
  21.       <Drug>
  22.         <Name>B</Name>
  23.         <Dose>2 spoonfuls</Dose>
  24.       </Drug>
  25.       <Drug>
  26.         <Name>C</Name>
  27.         <Dose>3 drops</Dose>
  28.       </Drug>
  29.     </Patient>
  30.     <Patient>
  31.       <Drug>
  32.         <Name>B</Name>
  33.         <Dose>2 spoonfuls</Dose>
  34.       </Drug>
  35.       <Drug>
  36.         <Name>B</Name>
  37.         <Dose>2 spoonfuls</Dose>
  38.       </Drug>
  39.       <Drug>
  40.         <Name>C</Name>
  41.         <Dose>3 drops</Dose>
  42.       </Drug>
  43.       <Drug>
  44.         <Name>D</Name>
  45.         <Dose>4 glasses</Dose>
  46.       </Drug>
  47.     </Patient>
  48.   </Multi>
  49. </Package>
  50.        
  51. <xsl:template match="/">
  52.     <xsl:for-each select="Package/Single | Package/Multi">
  53.       <xsl:call-template name="SO" />
  54.     </xsl:for-each>
  55.   </xsl:template>
  56.  
  57.   <xsl:key name="uniqueKey" match="//Patient/Drug" use="concat(Name, Dose)" />
  58.  
  59.   <xsl:template name="SO">
  60.     <UniquePerMultiOrSingle>
  61.       <xsl:for-each select="//Patient/Drug[
  62.                               generate-id() =
  63.                               generate-id(key('uniqueKey', concat(Name, Dose))[1])]">
  64.         <xsl:copy-of select="Name"/>
  65.         <xsl:copy-of select="Dose"/>
  66.       </xsl:for-each>
  67.     </UniquePerMultiOrSingle>
  68.   </xsl:template>
  69.        
  70. <UniquePerMultiOrSingle>
  71.   <Name>A</Name>
  72.   <Dose>1 tab</Dose>
  73.   <Name>B</Name>
  74.   <Dose>2 spoonfuls</Dose>
  75.   <Name>C</Name>
  76.   <Dose>3 drops</Dose>
  77.   <Name>D</Name>
  78.   <Dose>4 glasses</Dose>
  79. </UniquePerMultiOrSingle>
  80. <UniquePerMultiOrSingle>
  81.   <Name>A</Name>
  82.   <Dose>1 tab</Dose>
  83.   <Name>B</Name>
  84.   <Dose>2 spoonfuls</Dose>
  85.   <Name>C</Name>
  86.   <Dose>3 drops</Dose>
  87.   <Name>D</Name>
  88.   <Dose>4 glasses</Dose>
  89. </UniquePerMultiOrSingle>
  90.        
  91. <UniquePerMultiOrSingle>
  92.   <Name>A</Name>
  93.   <Dose>1 tab</Dose>
  94.   <Name>B</Name>
  95.   <Dose>2 spoonfuls</Dose>
  96. </UniquePerMultiOrSingle>
  97. <UniquePerMultiOrSingle>
  98.   <Name>A</Name>
  99.   <Dose>1 tab</Dose>
  100.   <Name>B</Name>
  101.   <Dose>2 spoonfuls</Dose>
  102.   <Name>C</Name>
  103.   <Dose>3 drops</Dose>
  104.   <Name>D</Name>
  105.   <Dose>4 glasses</Dose>
  106. </UniquePerMultiOrSingle>
  107.        
  108. <xsl:stylesheet version="1.0"
  109.  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  110.  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  111.  
  112.  <xsl:key name="kPackageDrugsByName" match="Drug"
  113.   use="concat(generate-id(../..), '+', Name, '+', Dose)"/>
  114.  
  115.  <xsl:template match="Single | Multi">
  116.   <xsl:text>&#xA;</xsl:text>
  117.   <xsl:value-of select="name()"/> -- Drugs:&#xA;<xsl:text/>
  118.  
  119.   <xsl:copy-of select=
  120.    "*/Drug
  121.        [generate-id()
  122.        =
  123.         generate-id(key('kPackageDrugsByName',
  124.                         concat(generate-id(../..),
  125.                                '+', Name, '+', Dose)
  126.                        )[1]
  127.                    )
  128.        ]/*"/>
  129.  </xsl:template>
  130. </xsl:stylesheet>
  131.        
  132. <Package>
  133.     <Single>
  134.         <Patient>
  135.             <Drug>
  136.                 <Name>A</Name>
  137.                 <Dose>1 tab</Dose>
  138.             </Drug>
  139.             <Drug>
  140.                 <Name>B</Name>
  141.                 <Dose>2 spoonfuls</Dose>
  142.             </Drug>
  143.         </Patient>
  144.     </Single>
  145.     <Multi>
  146.         <Patient>
  147.             <Drug>
  148.                 <Name>A</Name>
  149.                 <Dose>1 tab</Dose>
  150.             </Drug>
  151.             <Drug>
  152.                 <Name>B</Name>
  153.                 <Dose>2 spoonfuls</Dose>
  154.             </Drug>
  155.             <Drug>
  156.                 <Name>C</Name>
  157.                 <Dose>3 drops</Dose>
  158.             </Drug>
  159.         </Patient>
  160.         <Patient>
  161.             <Drug>
  162.                 <Name>B</Name>
  163.                 <Dose>2 spoonfuls</Dose>
  164.             </Drug>
  165.             <Drug>
  166.                 <Name>B</Name>
  167.                 <Dose>2 spoonfuls</Dose>
  168.             </Drug>
  169.             <Drug>
  170.                 <Name>C</Name>
  171.                 <Dose>3 drops</Dose>
  172.             </Drug>
  173.             <Drug>
  174.                 <Name>D</Name>
  175.                 <Dose>4 glasses</Dose>
  176.             </Drug>
  177.         </Patient>
  178.     </Multi>
  179. </Package>
  180.        
  181. Single -- Drugs:
  182. <Name>A</Name>
  183. <Dose>1 tab</Dose>
  184. <Name>B</Name>
  185. <Dose>2 spoonfuls</Dose>
  186.  
  187. Multi -- Drugs:
  188. <Name>A</Name>
  189. <Dose>1 tab</Dose>
  190. <Name>B</Name>
  191. <Dose>2 spoonfuls</Dose>
  192. <Name>C</Name>
  193. <Dose>3 drops</Dose>
  194. <Name>D</Name>
  195. <Dose>4 glasses</Dose>