Решил мой собственный вопрос.
В итоге я использовал код, лежащий в основе подхода ItemDataBound
, следующим образом:
asp code ;
<%-- get the current product XML --%>
<asp:XmlDataSource ID="productDS" runat="server" XPath="/product" DataFile="~/App_Theme/project/products/poduct1.xml"/>
<asp:DataList ID="product" DataSourceID="productDS" runat="server">
<ItemTemplate>
<%--
get the navigation XML and filter the nodes to only show the navItems with the current product category
--%>
<asp:XmlDataSource ID="navItemsDS" runat="server" XPath="/navigation/navItems/navItem" DataFile="~/App_Theme/project/productslist.xml"/>
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="navItemsDS" OnItemDataBound="navigation_ItemDataBound">
<HeaderTemplate>
<ul>
</HeaderTemplate>
<ItemTemplate>
<li><a href="productdetail.html?page=products&id=<%# XPath("prodctid") %>"><%# XPath("producttitle") %></a></li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
код позади ;
// hides navigation items that are not in the same category as this product.
public void navigation_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
// get a navigator for the current navigation item xml
XPathNavigator nav = ((IXPathNavigable)e.Item.DataItem).CreateNavigator();
// get a navigator for the product xml
XPathNavigator nav2 =((IXPathNavigable)((DataListItem)e.Item.Parent.Parent).DataItem).CreateNavigator();
String itemCategory = nav.SelectSingleNode("category").Value;
String productCategory = nav2.SelectSingleNode("category").Value;
if (itemCategory != productCategory)
{
e.Item.Visible = false;
}
}
Нахождение элемента данных в DataList, т. Е. e.item.Parent.Parent.DataItem
, изначально было трудно понять.
Затем переход кфактические значения узлов XML были немного неясными.
Код, представленный выше, работает для меня.