Когда применяется атрибут matchsl: template?(и как это можно переопределить) - PullRequest
1 голос
/ 18 августа 2010

Поскольку я понял атрибут соответствия тега шаблона, он определяет, какая часть дерева XML будет включена в шаблон.

Как бы то ни было, за некоторыми исключениями, у меня есть рабочий код, облегченный:

<xsl:template match="/root/content">
    <xsl:for-each select="/root/meta/errors/error">
        <p>
            <strong>Error:</strong> <xsl:value-of select="message" /> (<xsl:value-of select="data/param" />)<br />
            <xsl:for-each select="data/option">
                <xsl:value-of select="." /><br />
            </xsl:for-each>
        </p>
        <br /><br />
    </xsl:for-each>
</xsl:template>

Но когда я пытаюсь добавить условное выражение, подобное этому:

<xsl:template match="/root/content">
    <xsl:if test="not(/root/meta/error/errors/data/param)"-->
        <xsl:for-each select="/root/meta/errors/error">
            <p>
                <strong>Error:</strong> <xsl:value-of select="message" /> (<xsl:value-of select="data/param" />)<br />
                <xsl:for-each select="data/option">
                    <xsl:value-of select="." /><br />
                </xsl:for-each>
            </p>
            <br /><br />
        </xsl:for-each>
        <xsl:call-template name="trip_form">
            <xsl:with-param name="type" select="'driver'" />
                <xsl:with-param name="size" select="'savetrip'" />
            </xsl:call-template>
    </xsl:if>
</xsl:template>

Он больше не работает, почему и как я могу заставить его работать снова?

1 Ответ

3 голосов
/ 18 августа 2010

Соответствия атрибутов применяются, когда вы запрашиваете его (вы тянете со сложным и ненужным 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, и он пытается найти соответствующий шаблон для каждого узла, в котором он находится в данный момент.Вот и все, что нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...