Соответствия атрибутов применяются, когда вы запрашиваете его (вы тянете со сложным и ненужным for-each
, в результате чего атрибуты не совпадают вообще), в противном случае они игнорируются.Вот почему идиома копирования используется с определенным атрибутом apply-templates:
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="* | @*" />
</xsl:copy>
</xsl:template>
Когда речь идет о порядке , в котором они применяются, заказ является заказом документа, что означает: после применения элемента его атрибуты будут применены (в неопределенном порядке), а затем применены дочерние элементы.Атрибуты никогда не имеют дочерних элементов, а их родительский элемент - содержащий элемент.
"он определяет, какая часть дерева XML будет включена в шаблон."
Нет.Он вызывается, когда процессор обнаруживает ввод, соответствующий спецификации, или когда вы специально применяете этот ввод с помощью xsl:apply-templates
.Ваш код не должен использовать xsl:for-each
, это редко требуется.Вместо этого используйте xsl:apply-templates
.Это также даст вам возможность сопоставлять атрибуты, когда вам нравится.
Обычно вам не нужно указывать родительский атрибут в атрибуте сопоставления apply-templates.И вы, конечно же, не будете каждый раз записывать весь путь внутри шаблонов, что приведет к ухудшению юзабилити вашей таблицы стилей ... Вместо этого попробуйте что-то вроде этого и взгляните на некоторые учебники по XSL в сети (w3schools предоставляет некоторые основныеинформация и книга Теннисона рядом с бесценным, чтобы узнать об этом варианте функционального программирования):
<xsl:template match="/">
<xsl:apply-templates select="/root/content" />
</xsl:template>
<xsl:template match="content">
<xsl:apply-templates select="errors/error" />
</xsl:template>
<xsl:template match="error">
<p>
<strong>Error:</strong>
<xsl:value-of select="message" />
(<xsl:value-of select="data/param" />)
<br />
<xsl:apply-templates select="data/option" />
</p>
<br /><br />
</xsl:template>
<xsl:template match="option">
<xsl:value-of select="." /><br />
</xsl:template>
"Это больше не работает, почему и как я могу сделать этоработать снова? "
Потому что ваше if-утверждение, вероятно, всегда верно (или всегда ложно).Причина: если где-либо в вашем документе XPath верен, он всегда будет ложным, если он никогда не верен, он всегда будет верным.Использование xsl:if
с XPath, который запускается в корневом каталоге, для живого преобразования всегда даст один и тот же результат.Не уверен, что вы ищете, поэтому я не могу вам помочь здесь.Обычно вместо xsl:if
мы склонны использовать соответствующий шаблон (опять же, да, я знаю, что это скучно;).
Примечание: вы спрашиваете что-то об атрибутах в своем вопросе, на это я пытался ответитьв первом абзаце (до этого редактирования).Однако в вашем коде ничего нет об атрибутах, поэтому я не знаю, как вам на самом деле помочь.
Примечание на примечании: LarsH предполагает, что вы, возможно, хотите спросить о match
-атрибут внутри xsl:template
.Если так, ответ лежит в тексте выше где угодно, где я говорю о apply-шаблонах и тому подобном.Вкратце: входной документ обрабатывается, узел за узлом, возможно, направленный xsl:apply-templates
, и он пытается найти соответствующий шаблон для каждого узла, в котором он находится в данный момент.Вот и все, что нужно.