1

XSLT 1.0 Meunchian のグループ化は非常に複雑です。を使用して次のことを教えていただければ幸いですxsl:key。実際の XML は巨大であり、構造を示すためにその一部のみを使用しました。

追加の説明が必要な場合はお知らせください。

私の要件は、次のサンプル XML を表形式で表示し、最初に項目タイプ名でグループ化し、次に顧客名でグループ化することです。Detailsノードには常に 1 つのノードしかないことに注意してくださいDetail

望ましい出力

ItemType 顧客名 価格

ジョン・スミス 7 を予約する

DVD ジョン・スミス 45

DVD ジェーン・ドウ 44

入力:

<Item> 
   <SomeRandomField>abc</SomeRandomField>  
  <Details>
    <Detail>
        <Price>7.00</Price
        <CustomerName>John Smith</CustomerName>
     </Detail>
   </Details>
   <ItemType>   
      <Key>1</Key>
      <Name>Book</Name>
   </ItemType>
</Item>

<Item> 
   <SomeRandomField>mno</SomeRandomField>  
  <Details>
    <Detail>
        <Price>45.00</Price
        <CustomerName>John Smith</CustomerName>
     </Detail>
   </Details>
   <ItemType>   
      <Key>2</Key>
      <Name>DVD</Name>
   </ItemType>
</Item> 
<Item> 
   <SomeRandomField>xyz</SomeRandomField>  
  <Details>
    <Detail>
        <Price>44.00</Price
        <CustomerName>Jane Doe</CustomerName>
     </Detail>
   </Details>
   <ItemType>   
      <Key>2</Key>
      <Name>DVD</Name>
   </ItemType>
</Item> 
4

3 に答える 3

0

次のことが望ましい結果を達成すると思います。キーはItemTypeでグループ化するために使用され、必要に応じて顧客名をグループ化するために並べ替えを含めることができます。

XML

<?xml version="1.0" encoding="UTF-8"?>
<Items>
    <Item> 
        <SomeRandomField>abc</SomeRandomField>  
        <Details>
            <Detail>
                <Price>7.00</Price>
                <CustomerName>John Smith</CustomerName>
            </Detail>
        </Details>
        <ItemType>   
            <Key>1</Key>
            <Name>Book</Name>
        </ItemType>
    </Item>

    <Item> 
        <SomeRandomField>mno</SomeRandomField>  
        <Details>
            <Detail>
                <Price>45.00</Price>
                <CustomerName>John Smith</CustomerName>
            </Detail>
        </Details>
        <ItemType>   
            <Key>2</Key>
            <Name>DVD</Name>
        </ItemType>
    </Item> 
    <Item> 
        <SomeRandomField>xyz</SomeRandomField>  
        <Details>
            <Detail>
                <Price>44.00</Price>
                <CustomerName>Jane Doe</CustomerName>
            </Detail>
        </Details>
        <ItemType>   
            <Key>2</Key>
            <Name>DVD</Name>
        </ItemType>
    </Item> 
</Items>

XSL

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:key name="itemname" match="/Items/Item/ItemType" use="Name"/>
    <xsl:key name="custname" match="/Items/Item/Details/Detail" use="CustomerName"/>
    <xsl:output method="html" indent="yes"/>
    <xsl:template match="/">
        <html>
            <body>
                <xsl:for-each select="/Items/Item/ItemType
                    [generate-id(.) = generate-id(key('itemname', Name))]
                    ">
                    <xsl:variable name="local_item" select="Name"/>
                    <xsl:for-each select="/Items/Item">
                        <xsl:if test="ItemType/Name = $local_item">
                            <p><xsl:value-of select="$local_item"/>-
                                <xsl:value-of select="Details/Detail/CustomerName"/>-
                                <xsl:value-of select="Details/Detail/Price"/></p>
                        </xsl:if>
                    </xsl:for-each>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

HTML

<html>
   <body>
      <p>Book-John Smith-7.00</p>
      <p>DVD-John Smith-45.00</p>
      <p>DVD-Jane Doe-44.00</p>
   </body>
</html>
于 2012-10-18T15:44:16.327 に答える
0

上記の私の答えに加えて、この例では単純な並べ替えでも十分だと思います。

<?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:key name="itemname" match="/Items/Item/ItemType" use="Name"/>
        <xsl:key name="custname" match="/Items/Item/Details/Detail" use="CustomerName"/>
        <xsl:output method="html" indent="yes"/>
        <xsl:template match="/">
            <html>
                <body>
                    <xsl:for-each select="/Items/Item">
                        <xsl:sort select="ItemType/Name"/>
                        <xsl:sort select="Details/Detail/CustomerName"/>
                        <xsl:value-of select="."/><br/>
                    </xsl:for-each>
                </body>
            </html>
        </xsl:template>
    </xsl:stylesheet>
于 2012-10-18T15:48:18.353 に答える
0

次の xslt を使用して xml を変換し、必要な出力を得ることができ<Items>ます。ルート ノードを追加して xml を変更しました。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="html" indent="yes"/>

  <xsl:template match="Items">
    <table>
      <tr>
        <td>
          <b>ItemType</b>
        </td>
        <td>
          <b>Customer Name</b>
        </td>
        <td>
          <b>Price</b>
        </td>
      </tr>
      <xsl:for-each select="Item">
       <xsl:sort select="ItemType/Name" order="ascending"/>
        <tr>
          <td>
            <xsl:value-of select="ItemType/Name"/>
          </td>
          <td>
            <xsl:value-of select="Details/Detail/CustomerName"/>
          </td>
          <td>
            <xsl:value-of select="Details/Detail/Price"/>
          </td>
        </tr>
      </xsl:for-each>
    </table>
  </xsl:template>
</xsl:stylesheet>
于 2012-10-18T06:22:56.723 に答える