根据以下兄弟获取文本

时间:2014-11-30 13:42:12

标签: xslt xslt-2.0

我有以下的XML。

<?xml version="1.0" encoding="UTF-8"?>
    <main.line>
            <main>
                <name>Mohamad</name>
                <job.title prefix="no">B</job.title>
            </main>
            <main>
                <name>David</name>
                <job.title prefix="no">B</job.title>
            </main>
            <main>
                <name>Hashim</name>
                <job.title prefix="no">B</job.title>
            </main>
            <main>
                <name>Anthony</name>
                <job.title prefix="no">C</job.title>
            </main>
        </main.line>

这里我试图以下面的方式打印名称和job.title。

如果job.title相同且出现次数相似,则必须使用comma打印名称,并使用and打印姓氏以及job.title在开始时与A连接在一起。(这有点令人困惑,但我的输出会明确说明这一点。)

如果有两种情况,则应使用and打印,但不能打印comma

如果没有这种情况,名称应与job.title一起直接打印。

所需的输出如下。

Mohamad, David and Hashim BA, Anthony C

我试过的XSLT如下。

<xsl:template match="main.line">
    <xsl:for-each select="main  ">
        <xsl:choose>
            <xsl:when test="./job.title=following-sibling::main/job.title">
                <xsl:choose>
                    <xsl:when test="./job.title='A' or 'B' or 'C' or 'D' or 'E'">
                        <xsl:value-of select="./name"/>
                        <xsl:text>, </xsl:text>
                        <xsl:value-of select="following-sibling::main[1]/name"/>
                        <xsl:text> </xsl:text>
                        <xsl:value-of select="./job.title"/>
                        <xsl:text>A</xsl:text>
                        <xsl:text> </xsl:text>
                    </xsl:when>
                </xsl:choose>
            </xsl:when>
            <xsl:otherwise>
                <xsl:choose>
                    <xsl:when test="not(position() = last()) and fn:not(fn:position()=1)">
                        <xsl:text>, </xsl:text>
                    </xsl:when>
                    <xsl:when test="position()=last() and fn:not(fn:position()=1)">
                        <xsl:text> and </xsl:text>
                    </xsl:when>
                </xsl:choose>
                <xsl:value-of select="name"/>
                <xsl:text> </xsl:text>
                <xsl:value-of select="job.title"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:for-each>
</xsl:template>

但我目前得到的输出是

Mohamad, David BA David, Hashim BA , Hashim B and Anthony C.

请让我知道我哪里出错了以及如何获得所需的输出。

由于

1 个答案:

答案 0 :(得分:1)

我会将for-each-groupgroup-by一起使用(如果您想将所有main元素与job.title)或group-adjacent分组(如果您愿意仅对具有相同job.title的兄弟姐妹进行分组,以下是使用group-by的示例:

<xsl:template match="main.line">
  <xsl:for-each-group select="main" group-by="job.title">
    <xsl:value-of select="if (count(current-group()) eq 1)
                          then concat(name, ' ', job.title)
                          else if (count(current-group()) eq 2)
                               then concat(current-group()[1]/name, ' and ', current-group()[2]/name, job.title, 'A')
                               else concat(string-join(current-group()[position() lt (last() - 1)]/name, ', '), ', ',
                                           current-group()[last() - 1]/name, ' and ', current-group()[last()]/name, ' ', job.title, 'A')"/>
    <xsl:if test="position() != last()">, </xsl:if>
  </xsl:for-each-group>
</xsl:template>