1

我发现 XSLT 1.0 Meunchian 分组非常复杂。如果您可以指导我使用以下内容xsl:key,那就太好了。实际的 XML 很大,我只使用了其中的一部分来表示结构。

如果您需要任何其他说明,请告诉我。

我的要求是以表格格式显示以下示例 XML,首先按 itemtype 名称分组,然后按客户名称分组。请注意,该节点Details始终只有一个节点Detail

期望的输出

ItemType 客户名称 价格

书约翰史密斯 7

DVD 约翰史密斯 45

DVD Jane Doe 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

您可以使用以下 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 回答
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 回答