2014-10-25 4 views
0

Этот вопрос относится к XSL 1.0; в частности, потому, что затенение локальных переменных недопустимо.xsl: переменная область в xsl: for-each

Учитывая, что XSL переменные лексической области видимости, я не понимаю, почему этот пример, взятый из книги Майкла Кея (с 338 в 2/е и р 509 в 4/е..) Работы:

XML :

<program> 
    <opera> 
    <title>The Magic Flute</title> 
    <composer>Mozart</composer> 
    <date>1791</date> 
    </opera> 
    <opera> 
    <title>Ernani</title> 
    <composer>Verdi</composer> 
    <date>1843</date> 
    </opera> 
    ... 
    <composer name="Mozart"> 
    <fullname>Wolfgang Amadeus Mozart</fullname> 
    <born>1756</born> 
    <died>1791</died> 
    </composer> 
    ... 
</program> 

XSL:

... 
<xsl:for-each select="program/composer"> 
    <h2><xsl:value-of select="fullname"/></h2> 
    <xsl:variable name="c" select="."/> 
    <xsl:for-each select="program/opera[composer=$c/@name]"> 
    <p><xsl:value-of select="title"/></p> 
    </xsl:for-each> 
</xsl:for-each> 
... 

Почему бы это быть случаем декларирования переменных с несколько раз в одной и тот же лексическом контексте? Я, очевидно, что-то пропустил; скорее всего, что xsl: for-each создает несколько виртуальных лексических контекстов? Тем не менее, это начинает больше напоминать динамическое масштабирование. Я не должен думать об этом правильно.

+0

«* почему этот пример ... работает: *« На самом деле, это не так. –

+0

@ michael.hor257k Можете ли вы пояснить, что вы имеете в виду? Как этот пример не работает? – pgoetz

+0

** 1. ** У вас есть два способа написания 'xsl: value-of', и ни один из них не является правильным - ** 2. **' ' ничего не выбирает из контекста 'composer'. –

ответ

0

Я считаю, что у Майкла Кей всегда есть ответы, вы (или, по крайней мере, я) просто должны часто перечитывать вещи, прежде чем вы/я их получу. В этом случае, из объяснения эффекта:

Эффект < XSL: для каждой команды-> является экземпляр тела шаблона, который содержит один раз для каждого узла в выбранном node- задавать.

Итак, вот ответ: локальная переменная лексически сфера внутри каждого виртуального шаблона, генерируемого < XSL: для каждого->.

Это все еще немного странно для меня; это не лексическое или динамическое определение. Я догадался об этом только перед отправкой вопроса, но пошел дальше, разместил его в любом случае, если кто-то придет с той же путаницей, что и я.

+0

Легче об этом думать. Каждая переменная привязана к ее родительскому элементу в XSLT. Он выходит из сферы действия (перестает существовать) сразу же после закрытия родителя. – Tomalak

Смежные вопросы