xsl-list
[Top] [All Lists]

RE: Another key question

2002-10-17 16:14:09
Using current() in a key's use attribute is tricky with MSXML. See:

http://www.biglist.com/lists/xsl-list/archives/200206/msg00707.html

which describes a known bug in MSXML4. 

Chuck White
-------------------------
Author, Mastering XSLT, Sybex Books
Co-Author, Mastering XML Premium Edition, Sybex Books
http://www.javertising.com/webtech/

-----Original Message-----
From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com 
[mailto:owner-xsl-
list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of Richard Lander
Sent: Thursday, October 17, 2002 11:38 AM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Another key question

 Hello,

I'm trying to do something with keys and having a bit of trouble. In
doing
so, I've done some research with some sample data and come up with the
following results. I'm using system.xml.

C:\temp\XSLTProject2->
- type XSLTProject2_data.xml
<test>
        <section>
                <title>H1</title>
        </section>
        <section>
                <title>H2</title>
        </section>
        <section>
                <title>H2</title>
        </section>
        <section>
                <title>H3</title>
        </section>
        <section>
                <title>H2</title>
        </section>
        <section>
                <title>H1</title>
        </section>
        <section>
                <title>H2</title>
        </section>
</test>

C:\temp\XSLTProject2->
- type XSLTProject2.xslt
<?xml version="1.0"?>
<xslt:transform xmlns:xslt="http://www.w3.org/1999/XSL/Transform";
version="1.0">


        <xslt:key name="sections" match="section" use="generate-
id(current())"/>


        <xslt:template match="/">
                <xslt:apply-templates/>
        </xslt:template>

        <xslt:template match="test">
                <test>
                        <xslt:apply-templates select="section"/>

                </test>
        </xslt:template>

        <xslt:template match="section">
                <xslt:variable name="myID" select="generate-id(.)"/>

                <section>
                        <title><xslt:value-of select="title"/></title>
                        <para><xslt:value-of select="$myID"/></para>
                        <para><xslt:value-of select="generate-
id(key('sections',
$myID))"/></para>

                </section>
        </xslt:template>


</xslt:transform>

C:\temp\XSLTProject2->
- type out.xml
<?xml version="1.0" encoding="utf-8" ?>
<test>
        <section>
                <title>H1</title>
                <para>XSLTsection120120120</para>
                <para>XSLTsection120120120</para>
        </section>
        <section>
                <title>H2</title>
                <para>XSLTsection121120120</para>
                <para>XSLTsection120120120</para>
        </section>
        <section>
                <title>H2</title>
                <para>XSLTsection122120120</para>
                <para>XSLTsection120120120</para>
        </section>
        <section>
                <title>H3</title>
                <para>XSLTsection123120120</para>
                <para>XSLTsection120120120</para>
        </section>
        <section>
                <title>H2</title>
                <para>XSLTsection124120120</para>
                <para>XSLTsection120120120</para>
        </section>
        <section>
                <title>H1</title>
                <para>XSLTsection125120120</para>
                <para>XSLTsection120120120</para>
        </section>
        <section>
                <title>H2</title>
                <para>XSLTsection126120120</para>
                <para>XSLTsection120120120</para>
        </section>
</test>

Is the result above correct? I get the following result out of MSXML4.
MSXML3 is mostly the same as this (MSXML4), except that the first
section
has a string in the second para that is equal to the string in the
first
para.

<?xml version="1.0" ?>
<test>
      <section>
              <title>H1</title>
              <para>IDAEAWY</para>
              <para></para>
      </section>
      <section>
              <title>H2</title>
              <para>IDAGAWY</para>
              <para></para>
      </section>
      <section>
              <title>H2</title>
              <para>IDAIAWY</para>
              <para></para>
      </section>
      <section>
              <title>H3</title>
              <para>IDAKAWY</para>
              <para></para>
      </section>
      <section>
              <title>H2</title>
              <para>IDAMAWY</para>
              <para></para>
      </section>
      <section>
              <title>H1</title>
              <para>IDAOAWY</para>
              <para></para>
      </section>
      <section>
              <title>H2</title>
              <para>IDAQAWY</para>
              <para></para>
      </section>
</test>

What should happen?

My main question, is what does 'current()' mean in the context in
which
I've used it within xsl:key.

I'd like to do something like this:

      <xslt:key name="sections" match="section" use="generate-
id(preceding-sibling::section[title =
translate(current()/title,'23456789','12345678')][1])"/>


Thanks,

Rich

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



<Prev in Thread] Current Thread [Next in Thread>