Выберите различные позиции узлов в XSLT - PullRequest
0 голосов
/ 24 сентября 2019

Я хочу выбрать первый элемент и использовать @type='first', Последний элемент @type='last', элементы между первым и последним @type='middle'

Ввод:

<disp-quote>
  <p>Text 1</p>
  <p>Text 2</p>
  <p>Text 3</p>
  <p>Text 4</p>
</disp-quote>

Желаемый вывод:

<p type="first">Text 1</p>
<p type="middle">Text 2</p>
<p type="middle">Text 3</p>
<p type="last">Text 4</p>

Пробный код:

<xsl:template match="disp-quote/p">
 <p>
   <xsl:attribute name="type">
       <xsl:value-of select="self:p/position()"/>
   </xsl:attribute>
   <xsl:apply-templates/>
 </p>
</xsl:template>

Но вывод не работает должным образом.Пожалуйста, помогите решить эту проблему.Спасибо.Я использую XSLT 2.0

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

вы можете попробовать это выбрать при условии

<xsl:template match="disp-quote/p">
    <xsl:copy>
        <xsl:attribute name="type">
            <xsl:choose>
                <xsl:when test="not(preceding-sibling::p)">
                    <xsl:value-of select="'first'"/>
                </xsl:when>
                <xsl:when test="not(following-sibling::p)">
                    <xsl:value-of select="'last'"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="'middle'"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>
0 голосов
/ 24 сентября 2019

Почему бы просто:

        <p>
            <xsl:attribute name="type">
                <xsl:choose>
                    <xsl:when test="position()=1">first</xsl:when>
                    <xsl:when test="position()=last()">last</xsl:when>
                    <xsl:otherwise>middle</xsl:otherwise>
                </xsl:choose>
            </xsl:attribute>
        </p>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...