position() doesn't return expected value

Y

Yereth

Hi again,

still working on my xslt program and I ran into another problem. There is a
file which a contains the following structure:

<key>1</key>
<dict>
        ...
</dict>
<key>2</key>
<dict>
        ..
</dict>

When I am in a "dict" tag I want to get the value from the key before it,
because they belong to eachother.. (don't ask me why it's constructed like
this, wasn't my work) Now I wrote the following code which should do the
job:

<xsl:template match="plist/dict">
        <xsl:element name="playlist">
                <xsl:for-each select="child::dict/dict">
                        <xsl:call-template name="track"/>
                </xsl:for-each>
        </xsl:element>
</xsl:template>

<xsl:template name="track">
        <xsl:element name="track">
                <xsl:variable name="pos" select="position()"/>
                <xsl:apply-templates select="preceding-sibling::key[position()
$pos]"/>
                <xsl:for-each select="child::key">
                        <xsl:call-template name="key_value"/>
                </xsl:for-each>
        </xsl:element>
</xsl:template>

Only, once pos has gained a value, it doesn't seem to get a new value in the
next round of the "for-each" loop.. is this a bug or am I making a mistake
in my thinking? Any help would be appreciated!

Thanks in advance,

Yereth
 
P

Peter Flynn

What I just said. To find the element position, count the preceding
siblings of the same name, eg

<xsl:if test="count(preceding-sibling::dict)=0">

means "this is the first dict child of its parent".

Personally I would have called the existing function node-position()
and kept position() to mean what it always meant before: position
within the elements; but I think the design team assumed everyone
would be processing without a DTD or Schema, and would therefore
not be handling only element nodes. But that's life.

///Peter
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,820
Latest member
GilbertoA5

Latest Threads

Top