2014-11-30 5 views
1

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

Я хотел бы использовать 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> 
+0

Привет, Мартин, это здорово, работал как шарм. Просто быстрый вопрос, если у меня есть несколько 'C', это должно быть показано как' BC', можно ли изменить выше добавление дополнительного предложения 'if', или я должен использовать' select'? – user3872094

+0

Должно быть возможно добавить предложение 'if'. –

+0

Спасибо Мартин – user3872094

Смежные вопросы