Как получить этот вывод, используя XSLT? - PullRequest
0 голосов
/ 17 октября 2011

У меня есть следующий 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 Ответ

2 голосов
/ 17 октября 2011

Один из способов сделать это состоит в том, чтобы иметь различные подходящие шаблоны для элементов AName .

AName элементов, за которыми должна следовать запятая, должно иметь 2 илиследующие элементы AName :

<xsl:template match="AName[following-sibling::AName[following-sibling::AName]]">

Другие AName элементы, имеющие следующие элементы AName , которые не обнаруживаются при первом совпадении, затем должны быть "и", а не запятая, после них.

<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>

Doобратите внимание, что порядок соответствующих шаблонов в XSLT важен.Наиболее конкретный случай должен следовать после более общего случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...