Как я могу динамически заполнить выпадающее меню?

У меня есть код (HTML и JavaScript), который создает таблицу с тремя столбцами и динамическими строками. Я хотел бы иметь раскрывающееся меню на основе записей моего первого столбца. Таким образом, выпадающее меню должно быть заполнено после того, как моя таблица будет завершена. В первом столбце может быть несколько одинаковых записей. Поэтому необходимо показать их только один раз в моем раскрывающемся меню. На данный момент у меня есть только статическое выпадающее меню. См. код ниже. Программа очень хорошо работает со статическим выпадающим меню.

<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" xmlns:fo = "http://www.w3.org/1999/XSL/Format">
    <table id = "myTable">
        <colgroup>
            <col width = "150" style = "background-color:red"></col>
            <col width = "165"></col>
        </colgroup>
        <tr  style  = "background-color:grey">
            <th>plane
                <select id = "modelRangeDropdown" onchange = "filterReports()">
                    <option selected = "selected">All</option>
                    <option>number1</option>
                    <option>number2</option>                        
                </select>                   
            </th>   
            <th>Datum</th>
            <th>Secret</th>
        </tr>
        <xsl:for-each select = "logstore/plane/trigger">
            <tr>
                <td><xsl:value-of select = "../Name"/></td>
                <td><xsl:value-of select = "date"/></td>
                <td><xsl:value-of select = "secret"/></td>
            </tr>
        </xsl:for-each>
    </table>
    <script type = "text/javascript" src = "/../../../filterReports.js"></script>           
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Каков источник данных для этой таблицы?

Yevgen Gorbunkov 08.04.2019 16:21

Данные поступают из java-программы. С приведенным выше кодом «<xsl: for-each...>» я получу динамические данные из программы Java.

Checka 08.04.2019 17:40

Можете ли вы отредактировать свой вопрос, чтобы показать образец данных XML, которые вы получаете из программы, пожалуйста? Кроме того, можете ли вы сказать, можете ли вы использовать XSLT 2.0 или 3.0? (Я вижу, что в таблице стилей указана версия 1.0, но если решение включает в себя получение различных значений, то это будет немного проще с XSLT 2.0). Спасибо!

Tim C 08.04.2019 17:43

Кроме того, в вашей таблице стилей XSLT, похоже, отсутствует строка. У вас есть закрывающий тег </xsl:template> внизу, но нигде нет соответствующего открывающего тега <xsl:template match = "..">.

Tim C 08.04.2019 17:50

Судя по вашему вопросу, вы пытаетесь выполнить дедупликацию, чтобы создать свое меню. Мне до сих пор не ясно, используется ли таблица стилей в контексте серверной части (вы упоминаете «java-программу» как источник входного документа) или клиентской стороны (как указано в вопросе). Это позволит решить некоторые вопросы, сделанные в комментарии TimC.

Alejandro 08.04.2019 18:11

Извините, но я не могу публиковать реальные данные. Я не понимаю, почему вам должно быть выгодно видеть данные. У меня всего три столбца e. грамм. сигнал. Каждый сигнал имеет имя, дату и секретный номер. Сколько сигналов появится, зависит от файла, из которого берутся данные. Но это не имеет большого значения для моей проблемы.

Checka 08.04.2019 18:16

Я думаю, что могу обновить до xslt 2.0. Надо завтра проверить. Я скопировал код из своего файла и, очевидно, не скопировал строку «совпадение».

Checka 08.04.2019 18:18

Итак, я пытаюсь объяснить это снова: у меня есть файл Java, который считывает данные и создает файл xml со всеми данными. Приведенный выше код возьмет эти данные и создаст html-файл с таблицей и выпадающим меню. Вышеприведенная программа уже может фильтровать имя с помощью выпадающего меню (javascript здесь не указан. Должен ли я опубликовать его здесь?). Теперь я хотел бы заполнить раскрывающееся меню не так, как указано выше, с помощью <option...>, а динамическими записями, которые я получаю из «столбца имени» моей заполненной таблицы.

Checka 08.04.2019 18:21
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
8
326
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если бы вы могли использовать XSLT 2.0, вы могли бы использовать distinct-values и написать xsl:for-each вот так

<select id = "modelRangeDropdown" onchange = "filterReports()">
    <option selected = "selected">All</option>
    <xsl:for-each select = "distinct-values(logstore/plane/Name)">
        <option value = "{.}">
            <xsl:value-of select = "." />
        </option>
    </xsl:for-each>
</select>  

С другой стороны, если вы ограничены XSLT 1.0, вам нужно будет использовать технику под названием мюнхенская группировка. Вы бы определили ключ так:

<xsl:key name = "planes" match = "plane/Name" use = "." />

Затем, чтобы получить различные значения, вы должны сделать это.....

<select id = "modelRangeDropdown" onchange = "filterReports()">
    <option selected = "selected">All</option>
    <xsl:for-each select = "logstore/plane/Name[generate-id() = generate-id(key('planes', .)[1])]">
        <option value = "{.}">
            <xsl:value-of select = "." />
        </option>
    </xsl:for-each>                    
</select>  

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