Преобразуйте с помощью XSLT список XML в запятую с последними и последними записями и - PullRequest
0 голосов
/ 28 октября 2010

У меня есть список вроде:

<members>
    <name>Lorem Ipsum</name>
    <name>Lorem Ipsum</name>
    <name>Lorem Ipsum</name>
    <name>Lorem Ipsum</name>
</members>

Что мне нужно преобразовать в:

Lorem Ipsum, Lorem Ipsum, Lorem Ipsum and Lorem Ipsum.

Как это можно сделать?Я предполагаю, что в XSLT 1.0 мне нужно будет цикл для каждого, но как применить запятую, и или.в зависимости от его должности?

Заранее спасибо!

1 Ответ

2 голосов
/ 28 октября 2010

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="name">
        <xsl:variable name="vFollowing" 
                      select="count(following-sibling::name)"/>
        <xsl:value-of 
             select="concat(.,substring(', ',1 div ($vFollowing > 1)),
                              substring(' and ',1 div ($vFollowing = 1)),
                              substring('.',1 div ($vFollowing = 0)))"/>
    </xsl:template>
</xsl:stylesheet>

Вывод:

Lorem Ipsum, Lorem Ipsum, Lorem Ipsum and Lorem Ipsum.

РЕДАКТИРОВАТЬ : Также с fn:position() и fn:last()

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="name">
        <xsl:value-of 
             select="concat(.,substring(', ',1 div (last()-1 > position())),
                              substring(' and ',1 div (last()-1 = position())),
                              substring('.',1 div (last()=position())))"/>
    </xsl:template>
</xsl:stylesheet>

РЕДАКТИРОВАТЬ 2 : решение для сопоставления с образцом.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="name">
        <xsl:value-of select="concat(.,', ')"/>
    </xsl:template>
    <xsl:template match="name[last()-1 = position()]">
        <xsl:value-of select="concat(.,' and ')"/>
    </xsl:template>
    <xsl:template match="name[last()]">
        <xsl:value-of select="concat(.,'.')"/>
    </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...