我正在尝试格式化在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><!--063586465394-->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><!--063586481319-->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><!--063586465699-->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><!--063586481299-->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 & 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><!--063586477221-->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><!--063586477221-->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 & Collectibles;Apparel;Appliances;Attorneys;Auctioneers;Auto;Bakeries;Banks;Beauty Shops;Bulldozing, Road Construction, Heavy Equipment;Business & 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 & Laundry;Education;Electrical;Farm & Ranch Supply;Fast Food & Take Out;Fertilizer, Feed, Seed & Chemicals;Firearms;Flower Shop;Furniture;Gift Shops;Graphic Design;Grocery;Handyman/General Repair;Hardware;Health, Home & Beauty Products;Heating;Hunting Outfitters;Insurance;Karaoke Services;Lawn Care;Lawn Equipment;Lodging;Lumber Yards;Manicures & Pedicures;Massage;Meat;Medical;Mini-Storage;Mortuary;Newspaper;Nurseries & Greenhouses;Optometrist;Pet Supplies;Pharmacy;Photographer;Physical Therapy;Plumbing;Preschools;Printing;Property Maintenance;Public Schools;Quilting;Recreation;Restaurants;Senior Services;Sewing & 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" />&<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" />&<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="<div class="dnnGridItem">[UDT:EditLink];
[Company Name];
[Company Line 2];
[Address];
[Address Line 2];
[City-State-Zip];
[Phone 1];
[Phone 2];
[Email];
[Website (FULL URL)];
[Category]</div>" headerView="" detailView="[UDT:ListView][UDT:EditLink]
<table>
 <tr>
 <td class="normalBold">Company Name</td>
 <td class="Normal">[Company Name]</td>
 </tr>
 <tr>
 <td class="normalBold">Company Line 2</td>
 <td class="Normal">[Company Line 2]</td>
 </tr>
 <tr>
 <td class="normalBold">Address</td>
 <td class="Normal">[Address]</td>
 </tr>
 <tr>
 <td class="normalBold">Address Line 2</td>
 <td class="Normal">[Address Line 2]</td>
 </tr>
 <tr>
 <td class="normalBold">City-State-Zip</td>
 <td class="Normal">[City-State-Zip]</td>
 </tr>
 <tr>
 <td class="normalBold">Phone 1</td>
 <td class="Normal">[Phone 1]</td>
 </tr>
 <tr>
 <td class="normalBold">Phone 2</td>
 <td class="Normal">[Phone 2]</td>
 </tr>
 <tr>
 <td class="normalBold">Email</td>
 <td class="Normal">[Email]</td>
 </tr>
 <tr>
 <td class="normalBold">Website</td>
 <td class="Normal">[Website]</td>
 </tr>
 <tr>
 <td class="normalBold">Category</td>
 <td class="Normal">[Category]</td>
 </tr>
 <tr>
 <td class="normalBold">Created by</td>
 <td class="Normal">[Created by]</td>
 </tr>
 <tr>
 <td class="normalBold">Created at</td>
 <td class="Normal">[Created at_UDT_Value]</td>
 </tr>
 <tr>
 <td class="normalBold">Changed by</td>
 <td class="Normal">[Changed by]</td>
 </tr>
 <tr>
 <td class="normalBold">Changed at</td>
 <td class="Normal">[Changed at_UDT_Value]</td>
 </tr>
</table>" trackingEmail="" sorting="true" />
</xsl:stylesheet>
结果:
类别1
业务1,地址,电话......
商业2,地址,电话......
商业3,地址,电话......
商业4,地址,电话......
-
第2类
商业2,地址,电话......
商业5,地址,电话......
商业6,地址,电话......
-
第3类
业务1,地址,电话......
商业4,地址,电话......
商业7,地址,电话......
答案 0 :(得分:1)
通常,使用称为 Muenchian分组的方法实现XSLT 1.0中的分组。这里解释了该方法的基础知识:http://www.jenitennison.com/xslt/grouping/muenchian.html
在您的情况下,问题首先是具有多个类别的公司,并且通过以分号分隔列表(而不是单个元素,以及设计良好的XML文档的标准)列出类别进一步复杂化
这意味着您需要两次处理输入:
首先,每个公司都需要进行标记以单独创建 每个类别的可寻址节点;
接下来,我们将Muenchian分组应用于第一遍的结果, 为每个不同类别创建一个组并列出公司 在该类别中。
为了演示过程,我将使用以下最小化输入:
<强> 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>
呈现为: