我有以下的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.
请让我知道我哪里出错了以及如何获得所需的输出。
由于
答案 0 :(得分:1)
我会将for-each-group
与group-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>