Щелкните правой кнопкой по пункту меню Computer на меню "Пуск" и избранному 'Шоу на Рабочем столе' из контекстного меню, которое открывается.
В XSLT 2.0 есть два способа делать то, что вы хотите:
Один - это трехпараметрическая версия функции ключа
. Третий параметр позволяет указать корневой узел, с которым должен работать ключ (по умолчанию это всегда корень основного документа):
<xsl:value-of select="key('genre-lookup', $curr-genrecode,$lookupDoc)/@Genre"/>
Другой способ - использовать функцию ключа
под ] $ lookupDoc
узел:
<xsl:value-of select="$lookupDoc/key('genre-lookup', $curr-genrecode)/@Genre"/>
Оба этих метода описаны в спецификации XSLT 2.0 для ключей и не будут работать в XSLT 1.0.
Для полноты картины вам придется переписать это, чтобы не использовать ключи, если вы ограничены XSLT 1.0.
<xsl:value-of select="$lookupDoc//GenreMapping[@DepartmentCode = $curr-genrecode]/@Genre"/>
Ага! Проблема в select = "$ lookupDoc"
в вашем вызове apply-templates
вызывает шаблон по умолчанию, а не тот, который вы ожидаете,
Хорошо, это немного ментально, и я не утверждаю, что понимаю это, но это работает (похоже на карьеру программиста).
Проблема, с которой я столкнулся, заключалась в том, когда Я вызываю шаблоны apply и передаю внешний документ в качестве переменной, он никогда не совпадал ни с какими шаблонами, даже с теми, которые называются «Genremapping».
Поэтому я использовал подстановочный знак, чтобы поймать его, а также при вызове шаблонов apply я сузил круг узел установлен как дочерний элемент, который меня интересовал. Это было довольно безумно: я мог распечатать имя узла и увидеть «GenreMapping», но он никогда не входил ни в один шаблон, который я назвал «GenreMapping», выбирая вместо этого, чтобы всегда переходить только к «*» шаблон.
Это означает, что мой новый шаблон сопоставления вызывается для каждого отдельного узла GenreMapping, поэтому это может быть немного неэффективным.Тогда я понял, что все, что мне нужно сделать, это вывести что-нибудь, если предикат совпадает.
Итак, теперь это выглядит так (никакой ключ не используется):
...
<xsl:template match="/something">
<stuff>
<xsl:for-each select="monkey">
<Genre>
<key_value><xsl:value-of select="genrecode"/></key_value>
<xsl:variable name="key_val"><xsl:value-of select="genrecode"/></xsl:variable>
<code>
<xsl:apply-templates select="$lookupDoc/*/*/*/*">
<xsl:with-param name="curr-genrecode" select="string(genrecode)"/>
</xsl:apply-templates>
</code>
</Genre>
</xsl:for-each>
</stuff>
</xsl:template >
<xsl:template match="*">
<xsl:param name="curr-genrecode"/>
<xsl:value-of select=".[@DepartmentCode = $curr-genrecode]/@Genre"/>
</xsl:template>
...
Все это выводит: Обратите внимание, последнее значение key_value правильно не имеет записи кода, так как в справочном документе нет совпадений.
<?xml version="1.0" encoding="UTF-8"?>
<stuff xmlns:xs="http://www.w3.org/2001/XMLSchema">
<Genre>
<key_value>AAA</key_value>
<code>10 - NEWS</code>
</Genre>
<Genre>
<key_value>AAA</key_value>
<code>10 - NEWS</code>
</Genre>
<Genre>
<key_value>BBB</key_value>
<code>11 - NEWS</code>
</Genre>
<Genre>
<key_value>SVVS</key_value>
<code/>
</Genre>
</stuff>
Ответ на почтовый индекс. Спасибо за помощь, Велбог.