Xpoint
   [напомнить пароль]

Изменение значений переменных в XSLT

Метки: [без меток]
2007-08-01 14:06:37 [обр] kryll[досье]
У меня следующая проблема: есть xml файл, который состоит из 2х поддеревьев, я с помощью xslt рекурсивно хожу по элементам первого поддерева, и для каждого элемента смотрю встречается ли такой во втором поддереве. Те элементы которые не встречаются мне необходимо сохранить в какую-либо структуру (например строку). Потом я также рекурсивно обрабатываю второе поддерево и оформляю вывод, для каждого его элемента мне нужно проверить есть ли он в структуре - если есть, я добавляю его в вывод. Проблема в том, что нельзя изменять значения переменных и я не представляю как можно хранить промежуточные результаты. Помогите пожалуйста.
спустя 47 минут [обр] GRAy(64/259)[досье]
kryll[досье] А как вы определяете что это "такой" элемент? В общем случае это нетривиальная задача. Каков ваш частный случай.
спустя 2 часа 25 минут [обр] keep(0/3)[досье]
Проблема в том, что нельзя изменять значения переменных и я не представляю как можно хранить промежуточные результаты.

рекурсия с передачей в шаблон новых параметров разве не решает эту проблему?

как-нибудь так

  <xsl:template match="/">
     <xsl:call-template name="aaa">
         <xsl:with-param name="iterator" select="8"/>
   </xsl:call-template>
  </xsl:template>

  <xsl:template name="aaa">
      <xsl:param name="iterator" select="0"/>
      <xsl:message>Hello</xsl:message>
       <xsl:if test="$iterator">
         <xsl:call-template name="aaa">
            <xsl:with-param select="$iterator - 1"/>
         </xsl:call-template>
       </xsl:if>
  </xsl:template>

EXSLT пробовали?

спустя 13 часов [обр] kryll[досье]
сообщение промодерировано

Частный случай таков: у нас имеется какой-либо xml-документ (назовем его ОПИСАНИЕ) и другой xml-документ (назовем его ОПИСАТЕЛЬ). Связи между ОПИСАНИЕМ и ОПИСАТЕЛЕМ следующая: в ОПИСАТЕЛЕ элементы хранятся в единичном экземпляре, в ОПИСАНИИ любая ветка (кроме корневой может быть продублирована).
Пример ОПИСАТЕЛЯ

<h0>
    <h1>
      <h2/>
    </h1>
</h0>

Этому ОПИСАТЕЛЮ может, например, соответствовать следущее описание

<h0>
    <h1>
      <h2/>
      <h2/>
    </h1>
    <h1>
      <h2/>
    </h1>
</h0>

Мы продублировали один раз ветку <h1>, и один раз <h2/>.
Теперь нам необходимо поменять файл ОПИСАТЕЛЯ. На правила его изменения мы накладываем следующие ограничения: нельзя добавлять в него элементы, которые в нем уже существуют, можно только новые. Нельзя добавлять элементы так, чтоб изменился путь до уже существующих элементов: например вышеприведенный ОПИСАТЕЛЬ нельзя изменить следующим образом:

<h0>
    <h1>
      <h3>
        <h2/>
      <h3/>
    </h1>
</h0>

т.к. путь до <h2> изменился. Нельзя добавлять новый элемент, так что уже существующий терминальный элемент оказался нетерминальным, например так

<h0>
    <h1>
      <h2>
        <h3/>
      </h2>
    </h1>
</h0>

т.к. элемент <h2> стал нетерминальным
Можно делать например след. преобразования:

<h0>
    <h1>
      <h2/>
      <h3/>
    </h1>
    <h4>
      <h5/>
    </h4>
</h0>

Задача такая - в исходном файле есть новый ОПИСАТЕЛЬ и старое ОПИСАНИЕ. Например:

<Root>

    <hh0>
      <h1>
        <h2/>
        <h3/>
      </h1>
      <h4>
        <h5/>
      </h4>
    </hh0>

    <h0>
      <h1>
        <h2>
          <h3/>
        </h2>
      </h1>
    </h0>

</Root>

здесь вначале новый ОПИСАТЕЛЬ, затем старое ОПИСАНИЕ, корневые теги у них для удобства различные, но мы знаем их наименование
Нужно средствами xslt получить новое ОПИСАНИЕ, с включеными в него новыми элементами из нового ОПИСАТЕЛЯ. Я не представляю как это сделать без промежуточного хранения переменных. Может кто-нибудь знает? Подскажите. Спасибо

Powered by POEM™ Engine Copyright © 2002-2005