2017-09-22 5 views
1

J'ai une liste de services de station thermale, et je dois les ventiler par l'intermédiaire des groupements, via XSLT 1.0. Je peux séparer les noms en les groupant, mais en luttant avec ma concaténation des sous-groupes. Si vous exécutez mon script, vous verrez que mon premier groupe Muenchian fonctionne bien, en plaçant les noms des invités distinctement, mais je ne sais pas pourquoi ma deuxième clé concaténée ne fonctionne pas (les dates). Quelqu'un peut-il me diriger dans la bonne direction? Je ne suis pas très doué avec XSLT, mais j'aime essayer!XSLT: les malheurs multiples de groupement de Muenchian

entrée simplifié

<SQLXMLExport> 
 
<Rows> 
 
<Row> 
 
<Field alias="BOOK_FOR">Phone, Angie</Field> 
 
<Field alias="START_DATE">Tuesday, December 5, 2017</Field> 
 
<Field alias="ITEM_NAME">Sea Soak</Field> 
 
</Row> 
 
<Row> 
 
<Field alias="BOOK_FOR">Phone, Angie</Field> 
 
<Field alias="START_DATE">Tuesday, December 5, 2017</Field> 
 
<Field alias="ITEM_NAME">Ocean Package - Weekday</Field> 
 
</Row> 
 
<Row> 
 
<Field alias="BOOK_FOR">McNotes, Sue</Field> 
 
<Field alias="START_DATE">Tuesday, December 5, 2017</Field> 
 
<Field alias="ITEM_NAME">Experience Package - Weekday</Field> 
 
</Row> 
 
<Row> 
 
<Field alias="BOOK_FOR">McNotes, Sue</Field> 
 
<Field alias="START_DATE">Tuesday, December 5, 2017</Field> 
 
<Field alias="ITEM_NAME">Morning Soak - Weekday</Field> 
 
</Row> 
 
<Row> 
 
<Field alias="BOOK_FOR">McNotes, Sue</Field> 
 
<Field alias="START_DATE">Wednesday, December 6, 2017</Field> 
 
<Field alias="ITEM_NAME">Test Scrub - Weekday</Field> 
 
</Row> 
 
</Rows> 
 
</SQLXMLExport>

My XSLT 1,0

<?xml version="1.0" encoding="utf-8"?> 
 
<xsl:stylesheet version="1.0" 
 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
 
    <xsl:output method="html"/> 
 
    <xsl:key name="guests" match="Rows/Row" use="./Field[@alias='BOOK_FOR']"/> 
 
    <xsl:key name="guests-date" match="Rows/Row" use="concat(./Field[@alias='BOOK_FOR'] , '|' , ./Field[@alias='START_DATE'])"/> 
 
     
 
    <xsl:template match="Rows"> 
 
     <!-- Now, we need to iterate on the guest key --> 
 
     <xsl:for-each select="Row[count(. | key('guests', ./Field[@alias='BOOK_FOR'])[1]) = 1]"> 
 
      <!-- Sort by the guest --> 
 
      <xsl:sort select="./Field[@alias='BOOK_FOR']" /> 
 
      <br/><xsl:value-of select="./Field[@alias='BOOK_FOR']" /> 
 
      <hr /> 
 

 
      <!-- Now loop on the items of this guest, we get them from the key we defined --> 
 
      <xsl:for-each select="Row[count(. | key('guests-date' , concat(./Field[@alias='BOOK_FOR'] , '|' , ./Field[@alias='START_DATE']))[1]) = 1]"> 
 
       <!-- Sort by the start date --> 
 
       <!-- year --> 
 
       <xsl:sort select="substring-after(substring-after(./Field[@alias='START_DATE'],','), ',')" order="ascending" data-type="number" /> 
 
       <!-- day --> 
 
       <xsl:sort select="substring-after(substring-after(substring-before(substring-after(./Field[@alias='START_DATE'],','), ','), ' '), ' ')" order="ascending" data-type="number" /> 
 
       <!-- month...this is a mess, tackle later 
 
       <xsl:sort select="substring-before(substring-after(./Field[@alias='START_DATE'],','), ' ')" order="ascending" data-type="number" /> 
 
       --> 
 
       <xsl:value-of select="./Field[@alias='START_DATE']" /><br/>   
 
       <xsl:value-of select="./Field[@alias='ITEM_NAME']" /><br/> 
 
      </xsl:for-each> 
 
      <br /> 
 
     </xsl:for-each> 
 
    </xsl:template> 
 
     
 
</xsl:stylesheet>

sortie souhaitée

Je voudrais obtenir où le nom est d'abord, puis sous chaque nom sont les jours où ils viennent, avec leurs services répertoriés sous chaque date respective. Comme cet exemple ci-dessous:

McNotes, Sue 
 
<hr> 
 
<b>Tuesday, December 5, 2017</b><br> 
 
Experience Package - Weekday<br> 
 
Morning Soak - Weekday<br> 
 
<b>Wednesday, December 6, 2017</b> 
 
Test Scrub - Weekday<br> 
 

 
Phone, Angie 
 
<hr> 
 
<b>Tuesday, December 5, 2017</b><br> 
 
Sea Soak<br> 
 
Ocean Package - Weekday<br>

Répondre

1

Modifier ceci:

<xsl:for-each select="Row[count(. | key('guests-date' , concat(./Field[@alias='BOOK_FOR'] , '|' , ./Field[@alias='START_DATE']))[1]) = 1]"> 

à:

<xsl:for-each select="../Row[count(. | key('guests-date' , concat(./Field[@alias='BOOK_FOR'] , '|' , ./Field[@alias='START_DATE']))[1]) = 1]"> 

ExpLAN ation:

Vous êtes dans le contexte d'un ; vous devez aller au parent Rows afin de sélectionner le frère dans le même groupe.