Объявление кратных ключей в XSLT - PullRequest
1 голос
/ 27 мая 2020

Заранее благодарим за то, что нашли время прочитать это.

У меня есть файл XML, в котором мне нужно объявить ключ для каждого раздела.

<chapter>
    <section> First section
        <section>Section 1</section>
        <section>Section 2</section>
        <section>Section 3

            <informaltable role="table">
                <thead>
                    <row>
                        <entry>Familly</entry>
                        <entry>Type</entry>
                    </row>
                </thead>
                <tbody>
                    <row>
                        <entry>F1</entry>
                        <entry>T1</entry>
                    </row>
                    <row>
                        <entry>F1</entry>
                        <entry>T2</entry>
                    </row>
                </tbody>
            </informaltable>
        </section>
    </section>

    <section> Seconde section
        <section>Section 1</section>
        <section>Section 2</section>
        <section>Section 3

            <informaltable role="table">
                <thead>
                    <row>
                        <entry>Familly</entry>
                        <entry>Type</entry>
                    </row>
                </thead>
                <tbody>
                    <row>
                        <entry>F2</entry>
                        <entry>T2</entry>
                    </row>
                    <row>
                        <entry>F1</entry>
                        <entry>T2</entry>
                    </row>
                </tbody>
            </informaltable>
        </section>
    </section>
</chapter>

Теперь у меня есть ключи определены следующим образом

<xsl:key name="byFamilly" match="d:chapter/d:section[1]//d:row" use="d:entry[1]"/>  
<xsl:key name="byFamilly" match="d:chapter/d:section[2]//d:row" use="d:entry[1]"/>  

В случае количества разделов> 50 Можно объявить один ключ континент, различное значение каждого раздела.

Может любое один, помогите мне, как это сделать.

Спасибо.

1 Ответ

1 голос
/ 27 мая 2020

Обычный метод в XSLT 1 - вставить сгенерированный идентификатор из предка (т.е. section) в значение ключа, например,

<xsl:key name="byFamilly" match="d:chapter/d:section//d:row" use="concat(generate-id(ancestor::d:section), '|', d:entry[1])"/>  

В XSLT 2 и более поздних версиях функция key имеет необязательный третий аргумент, в который вы можете передать section, которым вы хотите ограничить поиск, чтобы вам не нужно было включать идентификатор в значение ключа.

...