| Subject: Re: [xsl] How to create xsl:key that has a composite value in  its "use" attribute? From: "Roger L Costello costello@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Sat, 15 Mar 2025 16:18:38 -0000 | 
Thank you, Martin for pushing me to create a simple sample input XML document
along with the XSLT program. I have done so but cannot replicate the problem
that I described earlier. However, I uncovered another problem that I hope you
can help me with.
Previously I described a join between the <row> elements in <ANAV> with the
<row> elements in <BDRY>. Actually, there is a 3-way join: the <row> elements
in <ARPT> join with the <row> elements in <ANAV> which join with the <row>
elements in <BDRY>.
ARPT --> ANAV --> BDRY
I have found that this template:
<xsl:template match="ARPT/ARPT/row">
    <result>
        <xsl:for-each select="key('ARPT-to-ANAV', ARPT_IDENT)">
            <xsl:sequence
select="key('ANAV-to-BDRY',(NAV_IDENT,NAV_CTRY,NAV_TYPE))[TYPE eq
'08']/BDRY_IDENT"/>
      </xsl:for-each>
    </result>
</xsl:template>
Produces the correct output:
<Document>
   <result>
      <BDRY_IDENT>Boundary 1</BDRY_IDENT>
      <BDRY_IDENT>Boundary 2</BDRY_IDENT>
   </result>
   <result>
      <BDRY_IDENT>Boundary 3</BDRY_IDENT>
      <BDRY_IDENT>Boundary 4</BDRY_IDENT>
   </result>
</Document>
But when I do-it-all-in-one-step, using a key within a key:
<xsl:template match="ARPT/ARPT/row">
    <result>
         <xsl:sequence select="key('ANAV-to-BDRY',key('ARPT-to-ANAV',
ARPT_IDENT)/(NAV_IDENT,NAV_CTRY,NAV_TYPE))[TYPE eq '08']/BDRY_IDENT"/>
    </result>
</xsl:template>
Then I get incorrect output:
<Document>
   <result>
      <BDRY_IDENT>Boundary 1</BDRY_IDENT>
      <BDRY_IDENT>Boundary 2</BDRY_IDENT>
   </result>
   <result/>
</Document>
Why does the key-within-a-key version not work correctly?
Below is my XSLT program, along with the XML input document.
-------------------------------------------------------
              XSLT Program
-------------------------------------------------------
<xsl:stylesheet version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:key name="ARPT-to-ANAV" match="ANAV/row" use="ARPT_IDENT"/>
  <xsl:key name="ANAV-to-BDRY" match="BDRY/row"
            use="NAV_IDENT,NAV_CTRY,NAV_TYPE "
            composite="yes"/>
  <xsl:template match="/*">
    <Document>
         <xsl:apply-templates select="ARPT/ARPT/row"/>
    </Document>
  </xsl:template>
  <xsl:template match="ARPT/ARPT/row">
    <result>
      <xsl:sequence select="key('ANAV-to-BDRY',key('ARPT-to-ANAV',
ARPT_IDENT)/(NAV_IDENT,NAV_CTRY,NAV_TYPE))[TYPE eq '08']/BDRY_IDENT"/>
      <!--<xsl:for-each select="key('ARPT-to-ANAV', ARPT_IDENT)">
        <xsl:sequence
select="key('ANAV-to-BDRY',(NAV_IDENT,NAV_CTRY,NAV_TYPE))[TYPE eq
'08']/BDRY_IDENT"/>
      </xsl:for-each>-->
    </result>
  </xsl:template>
</xsl:stylesheet>
-------------------------------------------------------
      Input XML Document
-------------------------------------------------------
<Document>
   <ARPT>
      <ARPT>
         <row>
            <ARPT_IDENT>ABC</ARPT_IDENT>
            <NAME>Airport 1</NAME>
         </row>
         <row>
            <ARPT_IDENT>DEF</ARPT_IDENT>
            <NAME>Airport 2</NAME>
         </row>
      </ARPT>
      <ANAV>
         <row>
            <ARPT_IDENT>ABC</ARPT_IDENT>
            <NAV_IDENT>HUM</NAV_IDENT>
            <NAV_CTRY>AR</NAV_CTRY>
            <NAV_TYPE>1</NAV_TYPE>
         </row>
         <row>
            <ARPT_IDENT>DEF</ARPT_IDENT>
            <NAV_IDENT>B</NAV_IDENT>
            <NAV_CTRY>US</NAV_CTRY>
            <NAV_TYPE>5</NAV_TYPE>
         </row>
         <row>
            <ARPT_IDENT>DEF</ARPT_IDENT>
            <NAV_IDENT>BNO</NAV_IDENT>
            <NAV_CTRY>US</NAV_CTRY>
            <NAV_TYPE>4</NAV_TYPE>
         </row>
      </ANAV>
   </ARPT>
   <BDRY>
      <BDRY>
         <row>
            <BDRY_IDENT>Boundary 1</BDRY_IDENT>
            <NAV_IDENT>HUM</NAV_IDENT>
            <NAV_CTRY>AR</NAV_CTRY>
            <NAV_TYPE>1</NAV_TYPE>
            <TYPE>08</TYPE>
         </row>
         <row>
            <BDRY_IDENT>Boundary 2</BDRY_IDENT>
            <NAV_IDENT>HUM</NAV_IDENT>
            <NAV_CTRY>AR</NAV_CTRY>
            <NAV_TYPE>1</NAV_TYPE>
            <TYPE>08</TYPE>
         </row>
         <row>
            <BDRY_IDENT>Boundary 3</BDRY_IDENT>
            <NAV_IDENT>BNO</NAV_IDENT>
            <NAV_CTRY>US</NAV_CTRY>
            <NAV_TYPE>4</NAV_TYPE>
            <TYPE>08</TYPE>
         </row>
         <row>
            <BDRY_IDENT>Boundary 4</BDRY_IDENT>
            <NAV_IDENT>BNO</NAV_IDENT>
            <NAV_CTRY>US</NAV_CTRY>
            <NAV_TYPE>4</NAV_TYPE>
            <TYPE>08</TYPE>
         </row>
      </BDRY>
   </BDRY>
</Document>
| Current Thread | 
|---|
| 
 | 
| <- Previous | Index | Next -> | 
|---|---|---|
| Re: [xsl] How to create xsl:key tha, Martin Honnen martin | Thread | Re: [xsl] How to create xsl:key tha, Martin Honnen martin | 
| Re: [xsl] How to create xsl:key tha, Martin Honnen martin | Date | Re: [xsl] How to create xsl:key tha, Martin Honnen martin | 
| Month |