Re: [xsl] Pairing elements according to attributes with XSLT 1

Subject: Re: [xsl] Pairing elements according to attributes with XSLT 1
From: Hermann Stamm-Wilbrandt <STAMMW@xxxxxxxxxx>
Date: Wed, 22 Jul 2009 10:36:37 +0200
$ cat doit.xsl
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
  <xsl:output method="xml" />

  <xsl:template match="/">
    <xsl:call-template name="doit">
      <xsl:with-param name="from" select="'big'" />
      <xsl:with-param name="to" select="'small'" />
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="doit">
    <xsl:param name="from" />
    <xsl:param name="to" />
    <MainWordInput xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
                   xsi:noNamespaceSchemaLocation="entriesResult.xsd"
                   fromSize="{$from}" toSize="{$to}">
      <xsl:for-each select="/KeywordsInfo/KeywordsEntry">
        <xsl:variable name="kentry" select="." />
        <xsl:for-each select="keyword[@size=$from]">
          <xsl:variable name="fromkw" select="." />>
          <xsl:for-each select="$kentry/keyword[@size=$to]">
            <Entries>
              <first><xsl:value-of select="$fromkw" /></first>
              <second><xsl:value-of select="." /></second>
            </Entries>
          </xsl:for-each>
        </xsl:for-each>
      </xsl:for-each>
    </MainWordInput>>
  </xsl:template>

</xsl:stylesheet>

$ xsltproc doit.xsl k.xml | tidy -q -xml
<?xml version="1.0"?>.
<MainWordInput
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xsi:noNamespaceSchemaLocation="entriesResult.xsd" fromSize="big"
toSize="small">
  <Entries>
    <first>bowling ball</first>
    <second>tennis ball</second>
  </Entries>
  <Entries>>
    <first>bowling ball</first>>
    <second>table tennis ball</second>
  </Entries>
  <Entries>>
    <first>mountain 1</first>
    <second>chair 1</second>>
  </Entries>
  <Entries>>
    <first>mountain 1</first>
    <second>chair 2</second>>
  </Entries>
  <Entries>>
    <first>mountain 2</first>
    <second>chair 1</second>>
  </Entries>
  <Entries>>
    <first>mountain 2</first>
    <second>chair 2</second>>
  </Entries>
</MainWordInput>

$



Mit besten Gr|_en / Best wishes,

Hermann Stamm-Wilbrandt
Developer, XML Compiler
WebSphere DataPower SOA Appliances
----------------------------------------------------------------------
IBM Deutschland Research & Development GmbH
Vorsitzender des Aufsichtsrats: Martin Jetter
Geschdftsf|hrung: Erich Baier
Sitz der Gesellschaft: Bvblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294



             Andy Kohn
             <andydev@xxxxxxxx
             m>                                                         To
                                       xsl-list@xxxxxxxxxxxxxxxxxxxxxx
             07/22/2009 08:52                                           cc
             AM
                                                                   Subject
                                       [xsl] Pairing elements according to
             Please respond to         attributes with XSLT 1
             xsl-list@xxxxxxxx
              lberrytech.com








Hi all,

I'm trying to pair elements according to attributes using XSLT 1.

Giving an example would be easier to explain ;)

This is an example of the input XML:


<KeywordsInfo>
    <KeywordsEntry>
        <keyword size="big">bowling ball</keyword>
        <keyword size="medium">should not be included</keyword>
        <keyword size="small">tennis ball</keyword>
        <keyword size="small">table tennis ball</keyword>
    </KeywordsEntry>
    <KeywordsEntry>
        <keyword size="big">mountain 1</keyword>
        <keyword size="big">mountain 2</keyword>
        <keyword size="small">chair 1</keyword>
        <keyword size="small">chair 2</keyword>
    </KeywordsEntry>
    <KeywordsEntry>
        <keyword size="medium">should not be excluded at all</keyword>
        <keyword size="tiny">should not be excluded at all</keyword>
    </KeywordsEntry>
</KeywordsInfo>


I need to create an XSLT 1, that gets two parameters, fromSize and
toSize, which then creates pairs of this entries.

For example, if I send fromSize=big, toSize=small, I need to get this
result:


<MainWordInput xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
            xsi:noNamespaceSchemaLocation="entriesResult.xsd"
            fromSize ="big"
            toSize="small">
   <Entries>
      <first>bowling ball</first>
      <second>tennis ball</second>
   </Entries>
   <Entries>
      <first>bowling ball</first>
      <second>table tennis ball</second>
   </Entries>
   <Entries>
      <first>mountain 1</first>
      <second>chair 1</second>
   </Entries>
   <Entries>
      <first>mountain 1</first>
      <second>chair 2</second>
   </Entries>
   <Entries>
      <first>mountain 2</first>
      <second>chair 1</second>
   </Entries>
   <Entries>
      <first>mountain 2</first>
      <second>chair 2</second>
   </Entries>
</MainWordInput>

Current Thread