2

次の構造を持つ XML ファイルの場合

 <?xml version="1.0" encoding="UTF-8">
 <farm xmlns:my="mynamespace.com" >
   <pen>
    <sheep> 3 </sheep>
    <cow> 3</cow>
    <pig> 2</pig>
    <chicken> 5</chicken>
   </pen>
  <pen>
    <sheep> 12 </sheep>
    <cow> 1</cow>
    <pig> 2</pig>
    <chicken> 4</chicken>
   </pen>
  <pen>
    <sheep> 4 </sheep>
    <cow> 4</cow>
    <pig> 1</pig>
    <chicken> 2</chicken>
   </pen>
 </farm>

各ペン ノード (for-each) をループし、羊、牛、豚、鶏などの動物の種類ごとに ID を生成し、合計をカウントする xsl スタイル シートがあります。以下のようにテーブルを生成する

ANIMAL   | VALUE
-----------------
pig      |  5
cow      |  8
sheep    | 19
chickens | 11

この結果セットを値列で並べ替えたいのですが、XSL を使用してサブクエリと同等のことを行うことは可能ですか?

4

2 に答える 2

3

この XSLT 1.0 変換:

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

 <xsl:key name="kAnimalByName" match="pen/*" use="name()"/>

 <xsl:template match="/*">
     <table border="1">
      <thead>
          <tr>
           <td>Animal</td>
           <td>Total</td>
          </tr>
      </thead>
      <tbody>
       <xsl:apply-templates select=
        "/*/pen/*
           [generate-id()
           =
            generate-id(key('kAnimalByName', name())[1])
            ]">
         <xsl:sort select="sum(/*/pen/*[name() = name(current())])"
                   data-type="number"/>
       </xsl:apply-templates>
      </tbody>
     </table>
 </xsl:template>

 <xsl:template match="pen/*">
  <tr>
   <td><xsl:value-of select="name()"/></td>
   <td>
     <xsl:value-of select="sum(/*/pen/*[name() = name(current())])"/>
   </td>
  </tr>
 </xsl:template>
</xsl:stylesheet>

提供された XML ドキュメントに適用した場合:

<farm xmlns:my="mynamespace.com" >
    <pen>
        <sheep> 3 </sheep>
        <cow> 3</cow>
        <pig> 2</pig>
        <chicken> 5</chicken>
    </pen>
    <pen>
        <sheep> 12 </sheep>
        <cow> 1</cow>
        <pig> 2</pig>
        <chicken> 4</chicken>
    </pen>
    <pen>
        <sheep> 4 </sheep>
        <cow> 4</cow>
        <pig> 1</pig>
        <chicken> 2</chicken>
    </pen>
</farm>

必要な正しい結果が生成されます。

<table border="1">
   <thead>
      <tr>
         <td>Animal</td>
         <td>Total</td>
      </tr>
   </thead>
   <tbody>
      <tr>
         <td>pig</td>
         <td>5</td>
      </tr>
      <tr>
         <td>cow</td>
         <td>8</td>
      </tr>
      <tr>
         <td>chicken</td>
         <td>11</td>
      </tr>
      <tr>
         <td>sheep</td>
         <td>19</td>
      </tr>
   </tbody>
</table>

説明:グループ化のための Muenchian メソッドの適切な使用。

于 2012-05-24T12:03:00.393 に答える
1

このスタイルシート...

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="html" indent="yes" encoding="UTF-8"
   doctype-public="-//W3C//DTD HTML 4.01//EN"
   doctype-system="http://www.w3.org/TR/html4/strict.dtd" />

 <xsl:template match="/">
 <HTML><head><title>Summary of Chattels</title></head>
 <BODY>
 <xsl:choose>
  <xsl:when test="count( farm/pen/*[namespace-uri()='']) != 0">
   <table style="border: 1px solid #808080">
    <tr><th>ANIMAL</th> <th>VALUE</th></tr>
    <xsl:for-each-group select="farm/pen/*[namespace-uri()='']" group-by="local-name()" >
      <xsl:sort select="sum( current-group())" data-type="number" order="ascending" />
      <xsl:sort select="local-name()" data-type="text" order="ascending" />
      <tr><td><xsl:value-of select="local-name()" /></td>
          <td><xsl:value-of select="sum( current-group())" /></td></tr>
    </xsl:for-each-group>
   </table>
  </xsl:when>
  <xsl:otherwise>
   <p>There are no chattels.</p>
  </xsl:otherwise>
 </xsl:choose>   
 </BODY>
 </HTML>
 </xsl:template>

</xsl:stylesheet>

指定されたサンプル ファイルに対してこの html を生成します ...

<!DOCTYPE html
  PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<HTML>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Summary of Chattels</title>
   </head>
   <BODY>
      <table style="border: 1px solid #808080">
         <tr>
            <th>ANIMAL</th>
            <th>VALUE</th>
         </tr>
         <tr>
            <td>pig</td>
            <td>5</td>
         </tr>
         <tr>
            <td>cow</td>
            <td>8</td>
         </tr>
         <tr>
            <td>chicken</td>
            <td>11</td>
         </tr>
         <tr>
            <td>sheep</td>
            <td>19</td>
         </tr>
      </table>
   </BODY>
</HTML>

テキスト出力が必要な場合は、テキストを調整するのは簡単なことです。

ファームが空の場合、代わりに次の出力が得られます ...

<!DOCTYPE html
  PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<HTML>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Summary of Chattels</title>
   </head>
   <BODY>
      <p>There are no chattels.</p>
   </BODY>
</HTML>
于 2012-05-24T06:29:49.800 に答える