xsl: переменная содержит набор узлов. Как вывести n-й узел переменной? - PullRequest
4 голосов
/ 07 мая 2010

Я преобразую XML-документ. Существует атрибут @prettydate, представляющий собой строку, аналогичную «Пятница, 7 мая 2010 года». Я хочу разбить эту строку и добавить ссылки на месяц и год. Я использую модуль exslt:strings и могу добавить любой другой необходимый модуль EXSLT.

Это мой код:

<xsl:template match="//calendar">
    <xsl:variable name="prettyparts">
        <xsl:value-of select="str:split(@prettydate,', ')"/>
    </xsl:variable>

    <table class='day'>
        <thead>
            <caption><xsl:value-of select="$prettyparts[1]"/>, 
                    <a>
                        <xsl:attribute name='href'><xsl:value-of select="$baseref"/>?date=<xsl:value-of select="@highlight"/>&amp;per=m</xsl:attribute>
                        <xsl:value-of select='$prettyparts[2]'/>
                    </a> 
                    <xsl:value-of select='$prettyparts[3]'/>,  
                    <a>
                        <xsl:attribute name='href'><xsl:value-of select="$baseref"/>?date=<xsl:value-of select="@highlight"/>&amp;per=y</xsl:attribute>
                        <xsl:value-of select='$prettyparts[4]'/>
                    </a> 
            </caption>
<!--etcetera-->

Я подтвердил, запустив $ prettyparts через <xml:for-each/>, что я получаю ожидаемый набор узлов:

<token>Friday</token>
<token>May</token>
<token>7</token>
<token>2010</token>

Но независимо от того, каким образом я пытаюсь обратиться к конкретному <token> напрямую (не в foreach), я не получаю никаких ошибок или различных ошибок, связанных с недействительными типами. Вот некоторый синтаксис, который я пробовал:

<xsl:value-of select="$prettyparts[2]"/>
<xsl:value-of select="$prettyparts/token[2]"/>
<xsl:value-of select="exsl:node-set($prettyparts/token[2])"/>
<xsl:value-of select="exsl:node-set($prettyparts/token)[2]"/>

Есть идеи, каким должно быть выражение?

ETA: благодаря предложению @ DevNull правильное выражение:

<xsl:value-of select="exsl:node-set($prettyparts)[position()=2]"/>

и я должен установить переменную следующим образом:

<xsl:variable name="prettyparts" select="str:split(@prettydate,', ')" />

1 Ответ

1 голос
/ 07 мая 2010

Попробуйте использовать [position()=2] вместо [2] в своих предикатах.

Пример:

<xsl:value-of select="$prettyparts[position()=2]"/>
...