Указание индексов узлов XPath для вложенных повторителей
Допустим, у меня есть иерархия XML, которая выглядит примерно так:
<Animal>
<Kingdom>
<Phylum>
<Class></Class>
<Class></Class>
</Phylum>
<Phylum>
<Class></Class>
<Class></Class>
</Phylum>
</Kingdom>
<Kingdom>
<Phylum>
<Class></Class>
<Class></Class>
</Phylum>
</Kingdom>
</Animal>
(etc.)
Кроме того, у меня есть ASP.NET код с использованием вложенных повторителей, что-то вроде этого:
<asp:Repeater ID="ShowKingdom" runat="server" DataSource="(SomeDataSource)">
<ItemTemplate>
<asp:TextBox ID="txtKingdom" runat="server" XPath="/*[local-name()='Animal']/*[local-name()='Kingdom'][{0}]">
<asp:Repeater ID="ShowPhylum" runat="server" OnItemDataBound="(SomeDataBinder)">
<ItemTemplate>
<asp:TextBox ID="txtKingdom" runat="server" XPath="/*[local-name()='Animal']/*[local-name()='Kingdom'][{0}]/*[local-name()='Phylum'][???]">
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
Моя проблема: как мне указать селектор индекса узла "[???]" для XPath внутри вложенного повторителя?!?
Примечание: мой язык VB в ASP.NET.
Изменить: я пытался использовать другой индекс "[{1}]" (дает мне ошибку индекса за пределами допустимого), относительный Xpath "[local-name()='Phylum']" (no "/*"предшествующий ему - не распознает узел / путь), а также возиться с вложенным источником данных повторителя (он либо не распознает XPath, либо вылетает).
Очевидно, я не смог заставить ни одного из них работать. Нужно ли рассматривать другой подход?
Редактирование #2: я попробовал еще одну вещь, которая не хочет работать: для вложенного повторителя:
DataSource="<%# XPathSelect('Phylum')%>"
1 ответ
Я наконец понял это. Я нашел ключ здесь.
После долгих поисков я понял, что мой индекс-предикат {0} в моем XPath заменяется в программном коде с помощью вызова String.format.
Я получил индекс родительского повторителя, сославшись на e.Item.Parent.Parent (где "e" - это объект RepeaterItemEventArgs).
Когда у меня были индексы для текущего повторителя и его родителя, я смог использовать {0} и {1} для своих индексов, а String.format сделал все остальное.
Вуаля. Задача решена.