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

Объединение наборов узлов средствами XSL. Возможно?

Метки: [без меток]
2007-08-07 20:26:27 [обр] Никита Козин (Wonder)[досье]

В переменной находится набор узлов, надо к этому набору добавить элемент и внутри элемента другой набор узлов из файла. Делаю вот так вот:

<xsl:variable name="hLanguages">
   <xsl:copy-of select="$hLanguages" />
   <xsl:element name="Module">
      <xsl:copy-of select="document( 'Module.xml' )/data/*" />
   </xsl:element>
</xsl:variable>

Естественно получаю бесконечную рекурсию.
Пробую обмануть:

<xsl:variable name="hLanguagesBackup">
   <xsl:copy-of select="$hLanguages" />
</xsl:variable

<xsl:variable name="hLanguages">
   <xsl:copy-of select="$hLanguagesBackup" />
   <xsl:element name="Module">
      <xsl:copy-of select="document( 'Module.xml' )/data/*" />
   </xsl:element>
</xsl:variable>

Но в итоге тоже рекурсия.
Как избежать этого?

спустя 15 часов [обр] keep(0/3)[досье]
  1. Переменную менять нельзя. По крайней мере стандартными средствами.
Никита, вот этот код работает?
<xsl:variable name="hLanguages_old">
   some old content.
   ..
   New node should be inserted in here
</xsl:variable>


<xsl:variable name="hLanguages_insertedNode">
    <xsl:copy-of select="$hLanguages_old"/>
   
    <Module>
      <xsl:copy-of select="document( 'Module.xml' )/data/*" />
   </Module>
</xsl:variable>
спустя 53 минуты [обр] Никита Козин (Wonder)[досье]
keep[досье]
Понятно. В том-то и дело, что с двумя разными переменными все работает.
А в моем случае создается одна переменная в одном файле, а дальше уже по необходимости в эту переменную добавляются узлы.
спустя 2 дня 5 часов [обр] keep(0/3)[досье]
Если бы мне понадобилась такая функциональность скорее всего я бы как-нибудь трансформировал уже существующий файл опций. Т.е. загружаешь его с помощью xpath document(path), а потом трансформируешь в новый файл настроек с помощью xsl:result-document. Но поверьте, это плохая архитектура. Гораздо лучше попробовать как-нибудь передавать параметры в xslt прямо из parser и делать что-нибудь именно в его переменных. Например - передаёшь в xslt хэш настроек и функцию доступа к этим настройкам. И с помощью этой ф-ии уже меняешь переменную parser. Никогда не пробовал так изворачиваться именно на parser. Но на ECMAScript+sax8 такой подход работает, правда его тоже "здоровым" называть сложно.
Powered by POEM™ Engine Copyright © 2002-2005