如何使用XSLT获得此输出?

时间:2011-10-17 05:25:37

标签: html xml xslt

我有以下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来完成吗?

提前致谢并度过愉快的一天 - 约翰

1 个答案:

答案 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中匹配模板的顺序很重要。最具体的案例必须在更一般的案例之后。