Как правильно скрыть список XML элементов обработанных через XSL с помощью JavaScript

Проблема со скрытием предупреждений в XSL

Привет всем! У меня есть XML файл с данными об ошибках и предупреждениях из лога сборки. Я смог написать XSL код чтобы показывать эти списки в браузере. Теперь хочу добавить JavaScript функцию с кнопкой для скрытия/показа предупреждений. Но что-то не работает как надо.

<xsl:template match="/">
    <xsl:variable name="alerts" select="//build//logs//notification" />
    <xsl:variable name="warn.alerts" select="$alerts[contains(text(), 'warn') or @type='Warning']" />
    <xsl:variable name="warn.count" select="count($warn.alerts)" />
    <xsl:if test="$warn.count > 0">
        <script type="text/javascript">
            function showHideWarnings() {
                var alertDiv = document.getElementById("warningList");
                var titleDiv = document.getElementById("warningHeader");
                if (alertDiv.style.display == "none") {
                    alertDiv.style.display = "block";
                    titleDiv.innerText = "Скрыть предупреждения";
                } else {
                    titleDiv.innerText = "Показать предупреждения";
                    alertDiv.style.display = "none";
                }
            }
        </script>
        <div>
            <button onclick="showHideWarnings()">
               <span id="warningHeader">Показать предупреждения</span>
            </button>
            <div id="warningList" style="display: none;">
                <xsl:for-each select="$warn.alerts">
                    <p class="warning-item">
                        <xsl:value-of select="."/>
                    </p>
                </xsl:for-each>
            </div>
        </div>
    </xsl:if>
</xsl:template>

Проблема в том что показывается только одно предупреждение когда нажимаю на ссылку. Я не очень хорошо знаю как правильно совмещать HTML, XSL и JavaScript.

Как мне правильно перебрать XSL элементы, показать их в таблице и при этом иметь возможность скрывать все эти элементы одной кнопкой?

Проверь структуру своего XML - возможно XPath //build//logs//notification не находит все элементы, которые ты ожидаешь. Добавь в XSL счетчик для проверки - выведи значение $warn.count где-нибудь, чтобы понять, сколько предупреждений реально находится. Еще одна мысль - попробуй contains(@level, 'warn') вместо contains(text(), 'warn'), если уровень предупреждения у тебя в атрибуте. JavaScript код нормальный, проблема скорее в XSL части.

Твой JavaScript код правильный, но есть подвох. При загрузке страницы alertDiv.style.display может быть пустой строкой, а не “none”, даже если в CSS прописано display: none. Попробуй поменять условие на if (alertDiv.style.display === "" || alertDiv.style.display === "none"). Или лучше - используй getComputedStyle(alertDiv).display вместо alertDiv.style.display. Это исправит баг с показом только одного предупреждения.

Уверен, что дело в JavaScript? По-моему, проблема в XSL селекторе. Попробуй //build/logs/notification вместо //build//logs//notification - одинарные слеши. Двойные ищут на любом уровне, может конфликтовать. И покажи структуру XML - какая она у тебя точно?