根据包含多个值的字段将XML数据分组到类别标题中

时间:2015-12-23 21:47:39

标签: xml xslt

我正在尝试格式化在DotNetNuke安装中输入到Form and List模块的一些数据。它基本上是一个商业目录 - 客户端将填写一份包含公司名称,地址等的表格,然后数据需要显示在类别标题中。对于每个公司,将有一个客户可以选择的可用类别列表 - 他们可以选择多个类别。

我已经搜索了一段时间,但似乎无法正常工作。我有编辑输出到HTML的XSL文件部分的经验。除此之外,我单独留下文件的其余部分,因为我对如何设置模板等没有太多了解。

下面是从模块生成的XML(我目前只添加了3个测试条目)以及当前的XSL文件以及如何在页面上显示结果。任何帮助将不胜感激!

XML:

<UserDefinedTable xmlns="DotNetNuke/UserDefinedTable">
  <Data>
    <UserDefinedRowId>9</UserDefinedRowId>
    <Company_x0020_Name>test 3</Company_x0020_Name>
    <Company_x0020_Line_x0020_2/>
    <Address>123</Address>
    <Address_x0020_Line_x0020_2/>
    <City-State-Zip/>
    <Phone_x0020_1>308.425.6039</Phone_x0020_1>
    <Phone_x0020_2/>
    <Email>info@test.com</Email>
    <Website_x0020__x0028_FULL_x0020_URL_x0029_>http://www.google.com/</Website_x0020__x0028_FULL_x0020_URL_x0029_>
    <Category>Advertising</Category>
    <Created_x0020_by>SuperUser Account</Created_x0020_by>
    <Created_x0020_at>2015-12-23T11:03:14-06:00</Created_x0020_at>
    <Changed_x0020_by>SuperUser Account</Changed_x0020_by>
    <Changed_x0020_at>2015-12-23T15:28:39-06:00</Changed_x0020_at>
    <Created_x0020_by_UDT_Original>host</Created_x0020_by_UDT_Original>
    <Created_x0020_by_UDT_Caption>SuperUser Account</Created_x0020_by_UDT_Caption>
    <Created_x0020_at_UDT_Value>&lt;!--063586465394--&gt;12/23/2015 11:03 AM</Created_x0020_at_UDT_Value>
    <Created_x0020_at_UDT_Ticks>635864653940000000</Created_x0020_at_UDT_Ticks>
    <Changed_x0020_by_UDT_Original>host</Changed_x0020_by_UDT_Original>
    <Changed_x0020_by_UDT_Caption>SuperUser Account</Changed_x0020_by_UDT_Caption>
    <Changed_x0020_at_UDT_Value>&lt;!--063586481319--&gt;12/23/2015 3:28 PM</Changed_x0020_at_UDT_Value>
    <Changed_x0020_at_UDT_Ticks>635864813190000000</Changed_x0020_at_UDT_Ticks>
  </Data>
  <Data>
    <UserDefinedRowId>10</UserDefinedRowId>
    <Company_x0020_Name>test 2</Company_x0020_Name>
    <Company_x0020_Line_x0020_2/>
    <Address/>
    <Address_x0020_Line_x0020_2/>
    <City-State-Zip/>
    <Phone_x0020_1>308.425.3654</Phone_x0020_1>
    <Phone_x0020_2/>
    <Email/>
    <Website_x0020__x0028_FULL_x0020_URL_x0029_/>
    <Category>Abstractor</Category>
    <Created_x0020_by>SuperUser Account</Created_x0020_by>
    <Created_x0020_at>2015-12-23T11:08:19-06:00</Created_x0020_at>
    <Changed_x0020_by>SuperUser Account</Changed_x0020_by>
    <Changed_x0020_at>2015-12-23T15:28:19-06:00</Changed_x0020_at>
    <Created_x0020_by_UDT_Original>host</Created_x0020_by_UDT_Original>
    <Created_x0020_by_UDT_Caption>SuperUser Account</Created_x0020_by_UDT_Caption>
    <Created_x0020_at_UDT_Value>&lt;!--063586465699--&gt;12/23/2015 11:08 AM</Created_x0020_at_UDT_Value>
    <Created_x0020_at_UDT_Ticks>635864656990000000</Created_x0020_at_UDT_Ticks>
    <Changed_x0020_by_UDT_Original>host</Changed_x0020_by_UDT_Original>
    <Changed_x0020_by_UDT_Caption>SuperUser Account</Changed_x0020_by_UDT_Caption>
    <Changed_x0020_at_UDT_Value>&lt;!--063586481299--&gt;12/23/2015 3:28 PM</Changed_x0020_at_UDT_Value>
    <Changed_x0020_at_UDT_Ticks>635864812990000000</Changed_x0020_at_UDT_Ticks>
  </Data>
  <Data>
    <UserDefinedRowId>11</UserDefinedRowId>
    <Company_x0020_Name>test</Company_x0020_Name>
    <Company_x0020_Line_x0020_2/>
    <Address/>
    <Address_x0020_Line_x0020_2/>
    <City-State-Zip/>
    <Phone_x0020_1/>
    <Phone_x0020_2/>
    <Email/>
    <Website_x0020__x0028_FULL_x0020_URL_x0029_/>
    <Category>Abstractor;Antiques &amp; Collectibles</Category>
    <Created_x0020_by>SuperUser Account</Created_x0020_by>
    <Created_x0020_at>2015-12-23T14:20:21-06:00</Created_x0020_at>
    <Changed_x0020_by>SuperUser Account</Changed_x0020_by>
    <Changed_x0020_at>2015-12-23T14:20:21-06:00</Changed_x0020_at>
    <Created_x0020_by_UDT_Original>host</Created_x0020_by_UDT_Original>
    <Created_x0020_by_UDT_Caption>SuperUser Account</Created_x0020_by_UDT_Caption>
    <Created_x0020_at_UDT_Value>&lt;!--063586477221--&gt;12/23/2015 2:20 PM</Created_x0020_at_UDT_Value>
    <Created_x0020_at_UDT_Ticks>635864772210000000</Created_x0020_at_UDT_Ticks>
    <Changed_x0020_by_UDT_Original>host</Changed_x0020_by_UDT_Original>
    <Changed_x0020_by_UDT_Caption>SuperUser Account</Changed_x0020_by_UDT_Caption>
    <Changed_x0020_at_UDT_Value>&lt;!--063586477221--&gt;12/23/2015 2:20 PM</Changed_x0020_at_UDT_Value>
    <Changed_x0020_at_UDT_Ticks>635864772210000000</Changed_x0020_at_UDT_Ticks>
  </Data>
  <Fields>
    <UserDefinedFieldId>22</UserDefinedFieldId>
    <ModuleID>447</ModuleID>
    <FieldTitle>Company Name</FieldTitle>
    <Required>true</Required>
    <FieldOrder>0</FieldOrder>
    <FieldType>String</FieldType>
    <Visible>true</Visible>
    <ShowOnEdit>true</ShowOnEdit>
    <Searchable>true</Searchable>
    <PrivateField>false</PrivateField>
    <MultipleValues>false</MultipleValues>
    <NormalizeFlag>false</NormalizeFlag>
    <ValueColumn>Company_x0020_Name</ValueColumn>
    <SortColumn>Company_x0020_Name</SortColumn>
  </Fields>
  <Fields>
    <UserDefinedFieldId>23</UserDefinedFieldId>
    <ModuleID>447</ModuleID>
    <FieldTitle>Company Line 2</FieldTitle>
    <Required>false</Required>
    <FieldOrder>1</FieldOrder>
    <FieldType>String</FieldType>
    <Visible>true</Visible>
    <ShowOnEdit>true</ShowOnEdit>
    <Searchable>true</Searchable>
    <PrivateField>false</PrivateField>
    <MultipleValues>false</MultipleValues>
    <NormalizeFlag>false</NormalizeFlag>
    <ValueColumn>Company_x0020_Line_x0020_2</ValueColumn>
    <SortColumn>Company_x0020_Line_x0020_2</SortColumn>
  </Fields>
  <Fields>
    <UserDefinedFieldId>24</UserDefinedFieldId>
    <ModuleID>447</ModuleID>
    <FieldTitle>Address</FieldTitle>
    <Required>false</Required>
    <FieldOrder>2</FieldOrder>
    <FieldType>String</FieldType>
    <Visible>true</Visible>
    <ShowOnEdit>true</ShowOnEdit>
    <Searchable>false</Searchable>
    <PrivateField>false</PrivateField>
    <MultipleValues>false</MultipleValues>
    <NormalizeFlag>false</NormalizeFlag>
    <ValueColumn>Address</ValueColumn>
    <SortColumn>Address</SortColumn>
  </Fields>
  <Fields>
    <UserDefinedFieldId>25</UserDefinedFieldId>
    <ModuleID>447</ModuleID>
    <FieldTitle>Address Line 2</FieldTitle>
    <Required>false</Required>
    <FieldOrder>3</FieldOrder>
    <FieldType>String</FieldType>
    <Visible>true</Visible>
    <ShowOnEdit>true</ShowOnEdit>
    <Searchable>false</Searchable>
    <PrivateField>false</PrivateField>
    <MultipleValues>false</MultipleValues>
    <NormalizeFlag>false</NormalizeFlag>
    <ValueColumn>Address_x0020_Line_x0020_2</ValueColumn>
    <SortColumn>Address_x0020_Line_x0020_2</SortColumn>
  </Fields>
  <Fields>
    <UserDefinedFieldId>26</UserDefinedFieldId>
    <ModuleID>447</ModuleID>
    <FieldTitle>City-State-Zip</FieldTitle>
    <Required>false</Required>
    <FieldOrder>4</FieldOrder>
    <FieldType>String</FieldType>
    <Visible>true</Visible>
    <ShowOnEdit>true</ShowOnEdit>
    <Searchable>false</Searchable>
    <PrivateField>false</PrivateField>
    <MultipleValues>false</MultipleValues>
    <NormalizeFlag>false</NormalizeFlag>
    <ValueColumn>City-State-Zip</ValueColumn>
    <SortColumn>City-State-Zip</SortColumn>
  </Fields>
  <Fields>
    <UserDefinedFieldId>27</UserDefinedFieldId>
    <ModuleID>447</ModuleID>
    <FieldTitle>Phone 1</FieldTitle>
    <Required>false</Required>
    <FieldOrder>5</FieldOrder>
    <FieldType>String</FieldType>
    <Visible>true</Visible>
    <ShowOnEdit>true</ShowOnEdit>
    <Searchable>false</Searchable>
    <PrivateField>false</PrivateField>
    <MultipleValues>false</MultipleValues>
    <NormalizeFlag>false</NormalizeFlag>
    <ValueColumn>Phone_x0020_1</ValueColumn>
    <SortColumn>Phone_x0020_1</SortColumn>
  </Fields>
  <Fields>
    <UserDefinedFieldId>28</UserDefinedFieldId>
    <ModuleID>447</ModuleID>
    <FieldTitle>Phone 2</FieldTitle>
    <Required>false</Required>
    <FieldOrder>6</FieldOrder>
    <FieldType>String</FieldType>
    <Visible>true</Visible>
    <ShowOnEdit>true</ShowOnEdit>
    <Searchable>false</Searchable>
    <PrivateField>false</PrivateField>
    <MultipleValues>false</MultipleValues>
    <NormalizeFlag>false</NormalizeFlag>
    <ValueColumn>Phone_x0020_2</ValueColumn>
    <SortColumn>Phone_x0020_2</SortColumn>
  </Fields>
  <Fields>
    <UserDefinedFieldId>29</UserDefinedFieldId>
    <ModuleID>447</ModuleID>
    <FieldTitle>Email</FieldTitle>
    <Required>false</Required>
    <FieldOrder>7</FieldOrder>
    <FieldType>String</FieldType>
    <Visible>true</Visible>
    <ShowOnEdit>true</ShowOnEdit>
    <Searchable>false</Searchable>
    <PrivateField>false</PrivateField>
    <MultipleValues>false</MultipleValues>
    <NormalizeFlag>false</NormalizeFlag>
    <ValueColumn>Email</ValueColumn>
    <SortColumn>Email</SortColumn>
  </Fields>
  <Fields>
    <UserDefinedFieldId>30</UserDefinedFieldId>
    <ModuleID>447</ModuleID>
    <FieldTitle>Website (FULL URL)</FieldTitle>
    <Required>false</Required>
    <FieldOrder>8</FieldOrder>
    <FieldType>String</FieldType>
    <Visible>true</Visible>
    <ShowOnEdit>true</ShowOnEdit>
    <Searchable>false</Searchable>
    <PrivateField>false</PrivateField>
    <MultipleValues>false</MultipleValues>
    <NormalizeFlag>false</NormalizeFlag>
    <ValueColumn>Website_x0020__x0028_FULL_x0020_URL_x0029_</ValueColumn>
    <SortColumn>Website_x0020__x0028_FULL_x0020_URL_x0029_</SortColumn>
  </Fields>
  <Fields>
    <UserDefinedFieldId>21</UserDefinedFieldId>
    <ModuleID>447</ModuleID>
    <FieldTitle>Category</FieldTitle>
    <Required>true</Required>
    <FieldOrder>9</FieldOrder>
    <FieldType>String</FieldType>
    <Visible>true</Visible>
    <ShowOnEdit>true</ShowOnEdit>
    <Searchable>false</Searchable>
    <PrivateField>false</PrivateField>
    <MultipleValues>true</MultipleValues>
    <InputSettings>Abstractor;Advertising;Agricultural;Antiques &amp; Collectibles;Apparel;Appliances;Attorneys;Auctioneers;Auto;Bakeries;Banks;Beauty Shops;Bulldozing, Road Construction, Heavy Equipment;Business &amp; Computer Services;Cable and Internet;Carpentry;Carpet, Flooring and Installation;Carwash;Cellular Phone;Certified Public Accountants;Chiropractor;Churches;Community Services;Convenience Stores;Crafts;Day Care;Dental;Drug Store;Dry Cleaners &amp; Laundry;Education;Electrical;Farm &amp; Ranch Supply;Fast Food &amp; Take Out;Fertilizer, Feed, Seed &amp; Chemicals;Firearms;Flower Shop;Furniture;Gift Shops;Graphic Design;Grocery;Handyman/General Repair;Hardware;Health, Home &amp; Beauty Products;Heating;Hunting Outfitters;Insurance;Karaoke Services;Lawn Care;Lawn Equipment;Lodging;Lumber Yards;Manicures &amp; Pedicures;Massage;Meat;Medical;Mini-Storage;Mortuary;Newspaper;Nurseries &amp; Greenhouses;Optometrist;Pet Supplies;Pharmacy;Photographer;Physical Therapy;Plumbing;Preschools;Printing;Property Maintenance;Public Schools;Quilting;Recreation;Restaurants;Senior Services;Sewing &amp; Quilt Making;T-Shirts;Taverns;Theaters;Thrift Shop;Tires;Toys;Truck and Trailer Repair;Trucking;Utilities;Variety Stores;Veterinarians;Well Drilling-[[vRBL]]</InputSettings>
    <NormalizeFlag>false</NormalizeFlag>
    <ValueColumn>Category</ValueColumn>
    <SortColumn>Category</SortColumn>
  </Fields>
  <Fields>
    <UserDefinedFieldId>20</UserDefinedFieldId>
    <ModuleID>447</ModuleID>
    <FieldTitle>Created by</FieldTitle>
    <Required>true</Required>
    <FieldOrder>10</FieldOrder>
    <FieldType>CreatedBy</FieldType>
    <Visible>false</Visible>
    <ShowOnEdit>false</ShowOnEdit>
    <Searchable>false</Searchable>
    <PrivateField>false</PrivateField>
    <MultipleValues>false</MultipleValues>
    <NormalizeFlag>false</NormalizeFlag>
    <ValueColumn>Created_x0020_by</ValueColumn>
    <SortColumn>Created_x0020_by</SortColumn>
  </Fields>
  <Fields>
    <UserDefinedFieldId>19</UserDefinedFieldId>
    <ModuleID>447</ModuleID>
    <FieldTitle>Created at</FieldTitle>
    <Required>true</Required>
    <FieldOrder>11</FieldOrder>
    <FieldType>CreatedAt</FieldType>
    <Visible>false</Visible>
    <ShowOnEdit>false</ShowOnEdit>
    <Searchable>false</Searchable>
    <PrivateField>false</PrivateField>
    <MultipleValues>false</MultipleValues>
    <NormalizeFlag>false</NormalizeFlag>
    <ValueColumn>Created_x0020_at_UDT_Value</ValueColumn>
    <SortColumn>Created_x0020_at</SortColumn>
  </Fields>
  <Fields>
    <UserDefinedFieldId>18</UserDefinedFieldId>
    <ModuleID>447</ModuleID>
    <FieldTitle>Changed by</FieldTitle>
    <Required>true</Required>
    <FieldOrder>12</FieldOrder>
    <FieldType>ChangedBy</FieldType>
    <Visible>false</Visible>
    <ShowOnEdit>false</ShowOnEdit>
    <Searchable>false</Searchable>
    <PrivateField>false</PrivateField>
    <MultipleValues>false</MultipleValues>
    <NormalizeFlag>false</NormalizeFlag>
    <ValueColumn>Changed_x0020_by</ValueColumn>
    <SortColumn>Changed_x0020_by</SortColumn>
  </Fields>
  <Fields>
    <UserDefinedFieldId>17</UserDefinedFieldId>
    <ModuleID>447</ModuleID>
    <FieldTitle>Changed at</FieldTitle>
    <Required>true</Required>
    <FieldOrder>13</FieldOrder>
    <FieldType>ChangedAt</FieldType>
    <Visible>false</Visible>
    <ShowOnEdit>false</ShowOnEdit>
    <Searchable>false</Searchable>
    <PrivateField>false</PrivateField>
    <MultipleValues>false</MultipleValues>
    <NormalizeFlag>false</NormalizeFlag>
    <ValueColumn>Changed_x0020_at_UDT_Value</ValueColumn>
    <SortColumn>Changed_x0020_at</SortColumn>
  </Fields>
  <FieldSettings>
    <FieldId>30</FieldId>
    <SettingName>Abbreviate</SettingName>
    <SettingValue>False</SettingValue>
  </FieldSettings>
  <FieldSettings>
    <FieldId>30</FieldId>
    <SettingName>EnforceDownload</SettingName>
    <SettingValue>False</SettingValue>
  </FieldSettings>
  <FieldSettings>
    <FieldId>30</FieldId>
    <SettingName>ShowOpenInNewWindow</SettingName>
    <SettingValue>False</SettingValue>
  </FieldSettings>
  <FieldSettings>
    <FieldId>30</FieldId>
    <SettingName>TrackDownloads</SettingName>
    <SettingValue>False</SettingValue>
  </FieldSettings>
  <Context>
    <ModuleId>447</ModuleId>
    <TabId>100</TabId>
    <TabName>Merchants</TabName>
    <PortalId>0</PortalId>
    <UserName>host</UserName>
    <BestUserName>SuperUser Account</BestUserName>
    <DisplayName>SuperUser Account</DisplayName>
    <ApplicationPath/>
    <HomePath>/Portals/0/</HomePath>
    <UserRoles>||All Users|Administrators|</UserRoles>
    <IsAdministratorRole>true</IsAdministratorRole>
    <Parameter/>
    <OrderBy>UserDefinedRowId</OrderBy>
    <OrderDirection>ascending</OrderDirection>
    <CurrentCulture>en-US</CurrentCulture>
    <LocalizedString_Search>Search</LocalizedString_Search>
    <LocalizedString_Page>Page</LocalizedString_Page>
    <LocalizedString_Of> of </LocalizedString_Of>
    <LocalizedString_First>First</LocalizedString_First>
    <LocalizedString_Previous>Previous</LocalizedString_Previous>
    <LocalizedString_Next>Next</LocalizedString_Next>
    <LocalizedString_Last>Last</LocalizedString_Last>
    <NowInTicks>635864813985230000</NowInTicks>
    <TodayInTicks>635864256000000000</TodayInTicks>
    <TicksPerDay>864000000000</TicksPerDay>
    <LocalizedDate>12/23/2015 3:29 PM</LocalizedDate>
    <Now>2015-12-23T15:29:58.523-06:00</Now>
  </Context>
</UserDefinedTable>

XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:udt="DotNetNuke/UserDefinedTable" exclude-result-prefixes="udt">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />
  <!--
  This prefix is used to generate module specific query strings
  Each querystring or form value that starts with udt_{ModuleId}_param 
  will be added as parameter starting with param
  -->
  <xsl:variable name="prefix_param">udt_<xsl:value-of select="//udt:Context/udt:ModuleId" />_param</xsl:variable>
  <xsl:param name="param_orderby" select="//udt:Fields[udt:UserDefinedFieldId=//udt:Context/udt:OrderBy]/udt:SortColumn" />
  <xsl:param name="param_direction" select="//udt:Context/udt:OrderDirection" />
  <!--wrong string would break stylesheet, so fallback to ascending if userinput is wrong-->
  <xsl:variable name="orderDirection">
    <xsl:choose>
      <xsl:when test="$param_direction='descending'">
        <xsl:text>descending</xsl:text>
      </xsl:when>
      <xsl:otherwise>
        <xsl:text>ascending</xsl:text>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:variable name="orderType">
    <xsl:variable name="DataType" select="//udt:Fields[udt:SortColumn=$param_orderby]/udt:FieldType" />
    <xsl:choose>
      <xsl:when test="$DataType='Int32' or $DataType='Decimal' or $DataType='Currency'">number</xsl:when>
      <xsl:otherwise>text</xsl:otherwise>
    </xsl:choose>
  </xsl:variable>

  <xsl:template match="udt:Data" mode="list">
    <div class="dnnGridItem">
      <xsl:call-template name="EditLink" />;
      <xsl:value-of select="udt:Company_x0020_Name" disable-output-escaping="yes" />;
      <xsl:value-of select="udt:Company_x0020_Line_x0020_2" disable-output-escaping="yes" />;
      <xsl:value-of select="udt:Address" disable-output-escaping="yes" />;
      <xsl:value-of select="udt:Address_x0020_Line_x0020_2" disable-output-escaping="yes" />;
      <xsl:value-of select="udt:City-State-Zip" disable-output-escaping="yes" />;
      <xsl:value-of select="udt:Phone_x0020_1" disable-output-escaping="yes" />;
      <xsl:value-of select="udt:Phone_x0020_2" disable-output-escaping="yes" />;
      <xsl:value-of select="udt:Email" disable-output-escaping="yes" />;
      <xsl:value-of select="udt:Website_x0020__x0028_FULL_x0020_URL_x0029_" disable-output-escaping="yes" />;
      <xsl:value-of select="udt:Category" disable-output-escaping="yes" />
    </div>
  </xsl:template>

  <xsl:template match="/udt:UserDefinedTable">
    <xsl:variable name="currentData" select="udt:Data" />
    <xsl:if test="$currentData">
      <!-- DEFINE ANY HEADERS HERE, EXAMPLE IS FOR TABLE TYPE LISTING -->
      <!-- Parameter header is optional! -->
      <!--
      <tr class="dnnGridHeader">
        <td/>
        <td>
          <xsl:apply-templates select ="udt:Fields[udt:FieldTitle='NameOfColumn']">
            <xsl:with-param name ="header" select ="NewHeaderName"/>
          </xsl:apply-templates>
        </td>...
      </tr>
      -->
      <xsl:apply-templates select="$currentData" mode="list">
        <xsl:sort select="*[name()=$param_orderby]" order="{$orderDirection}" data-type="{$orderType}" />
      </xsl:apply-templates>
    </xsl:if>
  </xsl:template>

  <xsl:template match="udt:Fields" name="SortingHeader">
    <xsl:param name="header" select="udt:FieldTitle" />
    <xsl:if test="udt:Visible='true' or udt:Visible='True'">
      <a>
        <xsl:attribute name="href">
          <xsl:choose>
            <xsl:when test="udt:ValueColumn=$param_orderby">
              <xsl:variable name="flippedDirection">
                <xsl:choose>
                  <xsl:when test="$orderDirection='ascending'">
                    <xsl:text>descending</xsl:text>
                  </xsl:when>
                  <xsl:otherwise>
                    <xsl:text>ascending</xsl:text>
                  </xsl:otherwise>
                </xsl:choose>
              </xsl:variable>
      ?<xsl:value-of select="$prefix_param" />_orderby=<xsl:value-of select="udt:ValueColumn" />&amp;<xsl:value-of select="$prefix_param" />_direction=<xsl:value-of select="$flippedDirection" /></xsl:when>
            <xsl:otherwise>
              ?<xsl:value-of select="$prefix_param" />_orderby=<xsl:value-of select="udt:ValueColumn" />&amp;<xsl:value-of select="$prefix_param" />_direction=<xsl:value-of select="$orderDirection" /></xsl:otherwise>
          </xsl:choose>
        </xsl:attribute>
        <!--flipped order direction-->
        <xsl:value-of select="$header" />
        <xsl:if test="udt:ValueColumn=$param_orderby">
          <img src="{//udt:Context/udt:ApplicationPath}/images/sort{$orderDirection}.gif" border="0" />
        </xsl:if>
      </a>
    </xsl:if>
  </xsl:template>

  <xsl:template name="EditLink">
    <xsl:if test="udt:EditLink">
      <a href="{udt:EditLink}">
        <img border="0" alt="edit" src="{//udt:Context/udt:ApplicationPath}/images/edit.gif" />
      </a>
    </xsl:if>
  </xsl:template>
<udt:template listType="div" delimiter=";" listView="&lt;div class=&quot;dnnGridItem&quot;&gt;[UDT:EditLink];&#xD;&#xA;[Company Name];&#xD;&#xA;[Company Line 2];&#xD;&#xA;[Address];&#xD;&#xA;[Address Line 2];&#xD;&#xA;[City-State-Zip];&#xD;&#xA;[Phone 1];&#xD;&#xA;[Phone 2];&#xD;&#xA;[Email];&#xD;&#xA;[Website (FULL URL)];&#xD;&#xA;[Category]&lt;/div&gt;" headerView="" detailView="[UDT:ListView][UDT:EditLink]&#xD;&#xA;&lt;table&gt;&#xD;&#xA;  &lt;tr&gt;&#xD;&#xA;    &lt;td class=&quot;normalBold&quot;&gt;Company Name&lt;/td&gt;&#xD;&#xA;    &lt;td class=&quot;Normal&quot;&gt;[Company Name]&lt;/td&gt;&#xD;&#xA;  &lt;/tr&gt;&#xD;&#xA;  &lt;tr&gt;&#xD;&#xA;    &lt;td class=&quot;normalBold&quot;&gt;Company Line 2&lt;/td&gt;&#xD;&#xA;    &lt;td class=&quot;Normal&quot;&gt;[Company Line 2]&lt;/td&gt;&#xD;&#xA;  &lt;/tr&gt;&#xD;&#xA;  &lt;tr&gt;&#xD;&#xA;    &lt;td class=&quot;normalBold&quot;&gt;Address&lt;/td&gt;&#xD;&#xA;    &lt;td class=&quot;Normal&quot;&gt;[Address]&lt;/td&gt;&#xD;&#xA;  &lt;/tr&gt;&#xD;&#xA;  &lt;tr&gt;&#xD;&#xA;    &lt;td class=&quot;normalBold&quot;&gt;Address Line 2&lt;/td&gt;&#xD;&#xA;    &lt;td class=&quot;Normal&quot;&gt;[Address Line 2]&lt;/td&gt;&#xD;&#xA;  &lt;/tr&gt;&#xD;&#xA;  &lt;tr&gt;&#xD;&#xA;    &lt;td class=&quot;normalBold&quot;&gt;City-State-Zip&lt;/td&gt;&#xD;&#xA;    &lt;td class=&quot;Normal&quot;&gt;[City-State-Zip]&lt;/td&gt;&#xD;&#xA;  &lt;/tr&gt;&#xD;&#xA;  &lt;tr&gt;&#xD;&#xA;    &lt;td class=&quot;normalBold&quot;&gt;Phone 1&lt;/td&gt;&#xD;&#xA;    &lt;td class=&quot;Normal&quot;&gt;[Phone 1]&lt;/td&gt;&#xD;&#xA;  &lt;/tr&gt;&#xD;&#xA;  &lt;tr&gt;&#xD;&#xA;    &lt;td class=&quot;normalBold&quot;&gt;Phone 2&lt;/td&gt;&#xD;&#xA;    &lt;td class=&quot;Normal&quot;&gt;[Phone 2]&lt;/td&gt;&#xD;&#xA;  &lt;/tr&gt;&#xD;&#xA;  &lt;tr&gt;&#xD;&#xA;    &lt;td class=&quot;normalBold&quot;&gt;Email&lt;/td&gt;&#xD;&#xA;    &lt;td class=&quot;Normal&quot;&gt;[Email]&lt;/td&gt;&#xD;&#xA;  &lt;/tr&gt;&#xD;&#xA;  &lt;tr&gt;&#xD;&#xA;    &lt;td class=&quot;normalBold&quot;&gt;Website&lt;/td&gt;&#xD;&#xA;    &lt;td class=&quot;Normal&quot;&gt;[Website]&lt;/td&gt;&#xD;&#xA;  &lt;/tr&gt;&#xD;&#xA;  &lt;tr&gt;&#xD;&#xA;    &lt;td class=&quot;normalBold&quot;&gt;Category&lt;/td&gt;&#xD;&#xA;    &lt;td class=&quot;Normal&quot;&gt;[Category]&lt;/td&gt;&#xD;&#xA;  &lt;/tr&gt;&#xD;&#xA;  &lt;tr&gt;&#xD;&#xA;    &lt;td class=&quot;normalBold&quot;&gt;Created by&lt;/td&gt;&#xD;&#xA;    &lt;td class=&quot;Normal&quot;&gt;[Created by]&lt;/td&gt;&#xD;&#xA;  &lt;/tr&gt;&#xD;&#xA;  &lt;tr&gt;&#xD;&#xA;    &lt;td class=&quot;normalBold&quot;&gt;Created at&lt;/td&gt;&#xD;&#xA;    &lt;td class=&quot;Normal&quot;&gt;[Created at_UDT_Value]&lt;/td&gt;&#xD;&#xA;  &lt;/tr&gt;&#xD;&#xA;  &lt;tr&gt;&#xD;&#xA;    &lt;td class=&quot;normalBold&quot;&gt;Changed by&lt;/td&gt;&#xD;&#xA;    &lt;td class=&quot;Normal&quot;&gt;[Changed by]&lt;/td&gt;&#xD;&#xA;  &lt;/tr&gt;&#xD;&#xA;  &lt;tr&gt;&#xD;&#xA;    &lt;td class=&quot;normalBold&quot;&gt;Changed at&lt;/td&gt;&#xD;&#xA;    &lt;td class=&quot;Normal&quot;&gt;[Changed at_UDT_Value]&lt;/td&gt;&#xD;&#xA;  &lt;/tr&gt;&#xD;&#xA;&lt;/table&gt;" trackingEmail="" sorting="true" />
</xsl:stylesheet>

结果:

类别1

  • 业务1,地址,电话......

  • 商业2,地址,电话......

  • 商业3,地址,电话......

  • 商业4,地址,电话......

-

第2类

  • 商业2,地址,电话......

  • 商业5,地址,电话......

  • 商业6,地址,电话......

-

第3类

  • 业务1,地址,电话......

  • 商业4,地址,电话......

  • 商业7,地址,电话......

1 个答案:

答案 0 :(得分:1)

通常,使用称为 Muenchian分组的方法实现XSLT 1.0中的分组。这里解释了该方法的基础知识:http://www.jenitennison.com/xslt/grouping/muenchian.html

在您的情况下,问题首先是具有多个类别的公司,并且通过以分号分隔列表(而不是单个元素,以及设计良好的XML文档的标准)列出类别进一步复杂化

这意味着您需要两次处理输入:

  1. 首先,每个公司都需要进行标记以单独创建 每个类别的可寻址节点;

  2. 接下来,我们将Muenchian分组应用于第一遍的结果, 为每个不同类别创建一个组并列出公司 在该类别中。

  3. 为了演示过程,我将使用以下最小化输入:

    <强> XML

    <UserDefinedTable xmlns="DotNetNuke/UserDefinedTable">
       <Data>
          <Company_Name>Alpha</Company_Name>
          <Address>123</Address>
          <Phone>308.425.6031</Phone>
          <Category>Red;Green</Category>
       </Data>
       <Data>
          <Company_Name>Bravo</Company_Name>
          <Address>45</Address>
          <Phone>308.425.3652</Phone>
          <Category>Green;Blue</Category>
       </Data>
       <Data>
          <Company_Name>Charlie</Company_Name>
          <Address>678</Address>
          <Phone>308.425.7293</Phone>
          <Category>Blue;Red</Category>
       </Data>
    </UserDefinedTable>
    

    应用以下样式表:

    XSLT 1.0

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:udt="DotNetNuke/UserDefinedTable" 
    xmlns:exsl="http://exslt.org/common"
    exclude-result-prefixes="udt exsl">
    <xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>
    
    <xsl:key name="company-by-category" match="company" use="category" />
    
    <xsl:template match="/">
        <!-- first pass: tokenize companies by category -->
        <xsl:variable name="first-pass">
            <xsl:for-each select="udt:UserDefinedTable/udt:Data">
                <xsl:call-template name="tokenize"/>
            </xsl:for-each>
        </xsl:variable>
        <xsl:variable name="first-pass-set" select="exsl:node-set($first-pass)" />
        <!-- output -->
        <html>
            <body>
                <xsl:apply-templates select="$first-pass-set/company[count(. | key('company-by-category', category)[1]) = 1]"/>
            </body>
        </html>
    </xsl:template>
    
    <xsl:template match="company">
        <div>
            <h3><xsl:value-of select="category"/></h3>
            <xsl:apply-templates select="key('company-by-category', category)" mode="list"/>
        </div>
    </xsl:template>
    
    <xsl:template match="company" mode="list">
        <p>
            <xsl:value-of select="name"/><br/>
            <xsl:value-of select="address"/><br/>
            <xsl:value-of select="phone"/>
        </p>
    </xsl:template>
    
    <xsl:template name="tokenize">
        <xsl:param name="text" select="udt:Category"/>
        <xsl:param name="delimiter" select="';'"/>
        <company>
            <name><xsl:value-of select="udt:Company_Name"/></name>
            <address><xsl:value-of select="udt:Address"/></address>
            <phone><xsl:value-of select="udt:Phone"/></phone>
            <category><xsl:value-of select="substring-before(concat($text, $delimiter), $delimiter)"/></category>
        </company>
        <!-- recursive call -->
         <xsl:if test="contains($text, $delimiter)">
            <xsl:call-template name="tokenize">
                <xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
    
    </xsl:stylesheet>
    

    将产生以下结果:

    <html>
       <body>
          <div>
             <h3>Red</h3>
             <p>Alpha<br/>123<br/>308.425.6031</p>
             <p>Charlie<br/>678<br/>308.425.7293</p>
          </div>
          <div>
             <h3>Green</h3>
             <p>Alpha<br/>123<br/>308.425.6031</p>
             <p>Bravo<br/>45<br/>308.425.3652</p>
          </div>
          <div>
             <h3>Blue</h3>
             <p>Bravo<br/>45<br/>308.425.3652</p>
             <p>Charlie<br/>678<br/>308.425.7293</p>
          </div>
       </body>
    </html>
    

    呈现为:

    enter image description here