3

以下の変換用のXSLTを作成しているときに、問題が発生しました。私はXSLT変換に比較的慣れていません。問題は、入力で異なる国からの学生の数を数えたいということです。条件に基づいてカウントしようとしましたが、このカウントはグループ化されているため機能しません。これができるかどうか誰かに教えてもらえますか?XSLT1.0です。

私の入力は

<ns0:DetailsResponse xmlns:ns0="http://MySchema.XSLTSchema">
  <Class>1</Class>
  <Students>
    <StudentName>John</StudentName>
    <StudentSurname>Doe</StudentSurname>
    <Country>
      <CountryName>UK</CountryName>
    </Country>
  </Students>
  <Students>
    <StudentName>Cherry</StudentName>
    <StudentSurname>Blossom</StudentSurname>
    <Country>
      <CountryName>US</CountryName>
    </Country>
  </Students>
  <Students>
    <StudentName>Ankit</StudentName>
    <StudentSurname>Sood</StudentSurname>
    <Country>
      <CountryName>INDIA</CountryName>
    </Country>
  </Students>
  <Students>
    <StudentName>Peter</StudentName>
    <StudentSurname>Scott</StudentSurname>
    <Country>
      <CountryName>UK</CountryName>
    </Country>
  </Students>
  <Students>
    <StudentName>Joe</StudentName>
    <StudentSurname>Carter</StudentSurname>
    <Country>
      <CountryName>UK</CountryName>
    </Country>
  </Students>
  <Students>
    <StudentName>Anu</StudentName>
    <StudentSurname>Mehta</StudentSurname>
    <Country>
      <CountryName>INDIA</CountryName>
    </Country>
  </Students>
</ns0:DetailsResponse>

そして、出力を次のようにしたいと思います

出力

<ns0:Root xmlns:ns0="http://MySchema.XSLTSchema_Destination">
  <DestinationClass>DestinationClass_0</DestinationClass>
  <Countries>
    <CountryWiseCount>
      <Country>INDIA</Country>
      <Count>2</Count>
    </CountryWiseCount>
    <CountryWiseCount>
      <Country>UK</Country>
      <Count>3</Count>
    </CountryWiseCount>
    <CountryWiseCount>
      <Country>US</Country>
      <Count>1</Count>
    </CountryWiseCount>
  </Countries>
</ns0:Root>
4

1 に答える 1

2

XSLT 1.0を使用している場合は、MuenchianGroupingがここでの友達になります。

国名で学生をグループ化しているので、そのように学生を検索するためのキーを定義します

<xsl:key name="students" match="Students" use="Country/CountryName"/>

次に、異なる国を取得するには、特定の国のキーで最初に発生する要素であるStudents要素を一致させます。

<xsl:template 
     match="Students[generate-id() = generate-id(key('students', Country/CountryName)[1])]">

次に、その国のすべての学生の数を取得するには、キーを数えるだけです。

<xsl:value-of select="count(key('students', Country/CountryName))"/>

完全なXSLTは次のとおりです。

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

   <xsl:key name="students" match="Students" use="Country/CountryName"/>

   <xsl:template match="Students[generate-id() = generate-id(key('students', Country/CountryName)[1])]">
      <CountryWiseCount>
         <Country>
            <xsl:value-of select="Country/CountryName"/>
         </Country>
         <Count>
            <xsl:value-of select="count(key('students', Country/CountryName))"/>
         </Count>
      </CountryWiseCount>
   </xsl:template>

   <xsl:template match="Students"/>

   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

XMLに適用すると、次のように出力されます。

<ns0:DetailsResponse xmlns:ns0="http://MySchema.XSLTSchema">
   <Class>1</Class>
   <CountryWiseCount>
      <Country>UK</Country>
      <Count>3</Count>
   </CountryWiseCount>
   <CountryWiseCount>
      <Country>US</Country>
      <Count>1</Count>
   </CountryWiseCount>
   <CountryWiseCount>
      <Country>INDIA</Country>
      <Count>2</Count>
   </CountryWiseCount>
</ns0:DetailsResponse>

キーの最初にないStudent要素に<xsl:template match="Students"/>一致するテンプレートを使用して、出力を停止していることに注意してください。XSLTは常に(xpath式を使用した)より具体的なテンプレートを優先するため、このテンプレートはすべてを無視することはありません。

もちろん、クラスに一致するようにテンプレートを使用してXSLTを拡張する必要がありますが、それを解決できると確信しています。

于 2013-03-17T18:06:21.700 に答える