Выберите один раз из дублирующейся информации XML, покажите остальные и сортируйте по полю - PullRequest
1 голос
/ 12 ноября 2010

У меня есть документ XML, который выглядит следующим образом.

<Results>
  <Name>Lab Asst1 </Name>
  <Subject> Math </Subject>
  <Marks>96</Marks>
  <Grade>A</Grade>

  <Name>Student1</Name>
  <Subject>Math</Subject>
  <Marks>90</Marks>
  <Grade>A</Grade>

  <Name>Student1</Name>
  <Subject>English</Subject>
  <Marks>70</Marks>
  <Grade>B</Grade>

  <Name>Lab Asst1 </Name>
  <Subject> Science</Subject>
  <Marks>99</Marks>
  <Grade>A</Grade>

    <Name>Student2</Name>
    <Subject>Science</Subject>
    <Marks>70</Marks>
    <Grade>B</Grade>

  </Results>

Как использовать XSL, какой самый простой способ отобразить, не показывая элемент <Name> дважды?Я хотел бы сначала отобразить результаты Lab Asst1, предполагая, что есть текстовое поле, которое использует это значение (происходит из кода C #): в основном, то, что делает эту часть сначала:

    User: <Name>
    Your results are:
    <table> 
   <tr>
     <td> Subject </td>
     <td> Marks </td> 
     <td> Grade </td>
   </tr>

, а затем вызывает другоешаблон и т. д. или сделать для каждого или что-то ....

<tr>
     <td> <xsl:value-of select="Subject"/>  </td>
     <td> <xsl:value-of select="Marks"/>  </td> 
     <td>  <xsl:value-of select="Grade"/> </td>
   </tr>

Так, что мои результаты выглядят так:

User: Lab Asst1
        Your results are:
        Subject | Marks | Grade 
    -------------------------------------
         Science|  99   |   A
           Math |  96   |   A


        User:Student1
        Your results are:
        Subject | Marks | Grade 
    -----------------------------
           Math |  95   |   A
        English |  70   |   B

        User:Student2
        Your results are:
        Subject | Marks | Grade 
    -----------------------------
           Math |  70   |   B

1 Ответ

2 голосов
/ 12 ноября 2010

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:key name="kPersByName" match="Name" use="."/>
 <xsl:key name="kData" match="*"
          use="preceding-sibling::Name[1]"/>

 <xsl:template match="/*">
  <xsl:for-each select=
   "Name[generate-id()
        =
         generate-id(key('kPersByName', .)[1])
        ]
   ">
   <xsl:variable name="vData" select="key('kData', .)"/>

    User: <xsl:value-of select="."/>
    Your results are:
    <table border="1">
       <tr>
         <td> Subject </td>
         <td> Marks </td>
         <td> Grade </td>
       </tr>

       <xsl:for-each select="$vData[self::Subject]">
        <tr>
          <td><xsl:value-of select="."/></td>
          <td><xsl:value-of select="following-sibling::Marks[1]"/></td>
          <td><xsl:value-of select="following-sibling::Grade[1]"/></td>
        </tr>
       </xsl:for-each>
    </table>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

применительно к предоставленному документу XML :

<Results>
  <Name>Lab Asst1 </Name>
  <Subject> Math </Subject>
  <Marks>96</Marks>
  <Grade>A</Grade>

  <Name>Student1</Name>
  <Subject>Math</Subject>
  <Marks>90</Marks>
  <Grade>A</Grade>

  <Name>Student1</Name>
  <Subject>English</Subject>
  <Marks>70</Marks>
  <Grade>B</Grade>

  <Name>Lab Asst1 </Name>
  <Subject> Science</Subject>
  <Marks>99</Marks>
  <Grade>A</Grade>

  <Name>Student2</Name>
  <Subject>Science</Subject>
  <Marks>70</Marks>
  <Grade>B</Grade>
</Results>

дает желаемые, правильные результаты :

    User: Lab Asst1 
    Your results are:
    <table border="1">  <tr>
        <td> Subject </td>
        <td> Marks </td>
        <td> Grade </td>
    </tr>
    <tr>
        <td> Math </td>
        <td>96</td>
        <td>A</td>
    </tr>
    <tr>
        <td> Science</td>
        <td>99</td>
        <td>A</td>
    </tr>
</table>

    User: Student1
    Your results are:
    <table border="1">
    <tr>
        <td> Subject </td>
        <td> Marks </td>
        <td> Grade </td>
    </tr>
    <tr>
        <td>Math</td>
        <td>90</td>
        <td>A</td>
    </tr>
    <tr>
        <td>English</td>
        <td>70</td>
        <td>B</td>
    </tr>
</table>

    User: Student2
    Your results are:
    <table border="1">
    <tr>
        <td> Subject </td>
        <td> Marks </td>
        <td> Grade </td>
    </tr>
    <tr>
        <td>Science</td>
        <td>70</td>
        <td>B</td>
    </tr>
</table>

Примечание :

  1. Используется мюнхенский метод группировки .

  2. В XSLT 2.0 проще и удобнее использовать инструкцию <xsl:for-each-group>.

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