我有以下XML文件 - 带有书名和各自的作者。对于同一本书,作者的数量可以是1或更多 -
<Authors>
<book>
<bName>HTML5</bName>
<AName>John</AName>
<AName>James</AName>
<AName>Jack</AName>
</book>
<book>
<bName>Java</bName>
<AName>Joe</AName>
</book>
<book>
<bName>XML</bName>
<AName>John</AName>
<AName>James</AName>
</book>
....
</Authors>
使用XSLT,如何生成输出,
<p>
<b>HTML5</b/><br/>
John, James and Jack
</p>
<p>
<b>Java</b/><br/>
Joe
</p>
<p>
<b>XML</b/><br/>
John and James
</p>
简而言之,如果有超过1个作者,则用逗号分隔,并在最后一个和最后一个作者名称之间加上“和”。
我正在使用XSLT 1.0。如果1.0不可能,那么可以用2.0来完成吗?
提前致谢并度过愉快的一天 - 约翰
答案 0 :(得分:2)
执行此操作的一种方法是为 AName 元素提供各种匹配模板。
必须后跟逗号的AName 元素必须包含2个或更多 AName 元素:
<xsl:template match="AName[following-sibling::AName[following-sibling::AName]]">
其他 AName 元素具有以下 AName 元素但未被第一场比赛选中,因此必须使用“and”amd而不是逗号,
<xsl:template match="AName[following-sibling::AName]">
所有其他 AName 元素都是列表中的最后一个元素,因此没有任何关注。
因此,给出以下XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:template match="Authors">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="book">
<p>
<xsl:apply-templates select="@*|node()"/>
</p>
</xsl:template>
<xsl:template match="bName">
<b>
<xsl:value-of select="."/>
</b>
<br/>
</xsl:template>
<xsl:template match="AName">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="AName[following-sibling::AName]">
<xsl:value-of select="."/>
<xsl:text> and </xsl:text>
</xsl:template>
<xsl:template match="AName[following-sibling::AName[following-sibling::AName]]">
<xsl:value-of select="."/>
<xsl:text>, </xsl:text>
</xsl:template>
</xsl:stylesheet>
应用于以下XML
<Authors>
<book>
<bName>HTML5</bName>
<AName>John</AName>
<AName>James</AName>
<AName>Jack</AName>
</book>
<book>
<bName>Java</bName>
<AName>Joe</AName>
</book>
<book>
<bName>XML</bName>
<AName>John</AName>
<AName>James</AName>
</book>
</Authors>
输出以下HTML
<p><b>HTML5</b><br>John, James and Jack</p>
<p><b>Java</b><br>Joe</p>
<p><b>XML</b><br>John and James</p>
请注意XSLT中匹配模板的顺序很重要。最具体的案例必须在更一般的案例之后。