Указание индексов узлов 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 сделал все остальное.

Вуаля. Задача решена.

Другие вопросы по тегам