У меня есть код (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>
Данные поступают из java-программы. С приведенным выше кодом «<xsl: for-each...>» я получу динамические данные из программы Java.
Можете ли вы отредактировать свой вопрос, чтобы показать образец данных XML, которые вы получаете из программы, пожалуйста? Кроме того, можете ли вы сказать, можете ли вы использовать XSLT 2.0 или 3.0? (Я вижу, что в таблице стилей указана версия 1.0, но если решение включает в себя получение различных значений, то это будет немного проще с XSLT 2.0). Спасибо!
Кроме того, в вашей таблице стилей XSLT, похоже, отсутствует строка. У вас есть закрывающий тег </xsl:template>
внизу, но нигде нет соответствующего открывающего тега <xsl:template match = "..">
.
Судя по вашему вопросу, вы пытаетесь выполнить дедупликацию, чтобы создать свое меню. Мне до сих пор не ясно, используется ли таблица стилей в контексте серверной части (вы упоминаете «java-программу» как источник входного документа) или клиентской стороны (как указано в вопросе). Это позволит решить некоторые вопросы, сделанные в комментарии TimC.
Извините, но я не могу публиковать реальные данные. Я не понимаю, почему вам должно быть выгодно видеть данные. У меня всего три столбца e. грамм. сигнал. Каждый сигнал имеет имя, дату и секретный номер. Сколько сигналов появится, зависит от файла, из которого берутся данные. Но это не имеет большого значения для моей проблемы.
Я думаю, что могу обновить до xslt 2.0. Надо завтра проверить. Я скопировал код из своего файла и, очевидно, не скопировал строку «совпадение».
Итак, я пытаюсь объяснить это снова: у меня есть файл Java, который считывает данные и создает файл xml со всеми данными. Приведенный выше код возьмет эти данные и создаст html-файл с таблицей и выпадающим меню. Вышеприведенная программа уже может фильтровать имя с помощью выпадающего меню (javascript здесь не указан. Должен ли я опубликовать его здесь?). Теперь я хотел бы заполнить раскрывающееся меню не так, как указано выше, с помощью <option...>, а динамическими записями, которые я получаю из «столбца имени» моей заполненной таблицы.
Если бы вы могли использовать 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>
Каков источник данных для этой таблицы?