Вопрос о ссылке на переменную в цепочечных XSLT - PullRequest
0 голосов
/ 24 января 2011

Я думаю, что это вопрос новичка, он касается ссылок на переменные в разных шаблонах XSLT. Структура выглядит так:

Во-первых, у меня есть XSLT-файл, и в нем я объявил шаблон A, а внутри него я в основном перебираю каждую запись (строку) XML-файла, скажем, xml_A, и я объявил переменная для ссылки на конкретное поле с именем «id» текущей записи в xml_A. Затем в этом цикле for-each мне нужно вызвать другой шаблон B.

 <xsl:template name="A">
 <LoopA> 
    <xsl:for-each select="$xml_A//xml_A_row">
    <xsl:variable name="id_A" select="id"/>
     ....
 </LoopA>
 <xsl:call-template name="B"/> 
 </xsl:template> 

Для шаблона B я фактически создал другой файл XSLT в том же каталоге. B содержит миллионы записей из xml-файла "xml_B", но я хочу только те записи, в которых поле SAME id является текущей записью шаблона A. Вот как я это сделал:

<xsl:template name="B">
<LoopB>
<xsl:variable name="id_A" select="id"/>
 ...
</loopB>
</xsl:template>    

А вот и мой вопрос. Я использовал выше <xsl:variable name="id_A" select="id"/> для обращения к полю id текущей записи, в которой включен верхний цикл. Однако я не уверен, что это правильно, я провел некоторое тестирование, поскольку файл данных очень большой, поэтому визуально проверить, правильно ли он работает, нелегко.

Так что мне интересно, может ли кто-нибудь посоветовать правильность приведенной выше ссылки на переменную внешнего цикла, поскольку, если я ее удалю, редактор XML будет жаловаться.

Заранее спасибо.

Обновление от комментариев

Думаю, я не достаточно ясно дал понять. На самом деле ни xml_A, ни xml_B не является XML-файлы, которые будут XSLTed. Это просто файлы данных, которые я буду использовать для получения данных, и есть другой файл XML C, который используется как для применяя таблицу стилей, и это пустой. Так в моей таблице стилей, используя предоставить ответ, у меня должен быть способ сделать это ссылаться на это хранилище данных файл xml_A.

1 Ответ

4 голосов
/ 24 января 2011

Типичный стиль XSLT:

<xsl:variable name="xml_B" select="document('xml_B.xml')">

<xsl:template match="xml_A_row">
   <xsl:apply-templates select="$xml_B/path/to/xml_B_row[id = current()/id]"/>
</xsl:template>

Примечание : сопоставление с шаблоном вместо xsl:for-each и именованные шаблоны, xsl:apply-templates вместо xsl:call-template, current()функция для ссылки на узел контекста.

РЕДАКТИРОВАТЬ : чтобы больше походить на ваш неполный фрагмент таблицы стилей ...

<xsl:key name="kBRowById" match="xml_B_row" use="id"/>

<xsl:variable name="xml_A" select="document('xml_A.xml')"/>
<xsl:variable name="xml_B" select="document('xml_B.xml')"/>

<xsl:template name="A">
  <LoopA>
      <xsl:for-each select="$xml_B">
          <xsl:apply-templates select="key('kBRowById',$xml_A//xml_A_row/id)"
                               mode="just-in-case"/>
      </xsl:for-each>
  </LoopA>
</xsl:template>

<xsl:template match="xml_B_row" mode="just-in-case">
  <LoopB/>
</xsl:template>

Примечание :Используя xsl:key, потому что вы написали «миллионы записей», xsl:for-each с одноэлементным корневым узлом, чтобы изменить узел контекста для функции fn:key(), используя внешнюю переменную самой области действия $xml_A для значения ключа перекрестной ссылки.mode есть на всякий случай, если есть конфликт с другими правилами таблицы стилей, которые вы не предоставили.

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