Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > во вложенном фориче получить значение аттрибута тэ


Автор: Мурлыкатам_ 15.1.2008, 17:00
Здравствуйте, добрые люди!

Проблема заключается в том, что один цикл вложен в другой, и у меня не получается во вложенном цикле получить значение аттрибута элемента, который указан в верхнем цикле:
Код

<xsl:for-each select="/data/sector">  <!-- sector -->
<tr>
 <td>
    <xsl:value-of select="."/>
    <xsl:text> </xsl:text>
    <xsl:value-of select="@id"/>
 </td>
</tr>
    <xsl:for-each select="/data/subsector">    <!-- subsector -->
      <tr>
        <td>
    <small><xsl:value-of select="."/></small>
            <xsl:text> | </xsl:text>
    <xsl:value-of select="/data/sector/@id"/>      <-- Тут надо получить значение айди сектора из верхнего цикла.
    <small><xsl:value-of select="./@id"/></small>
        </td>
     </tr>
   </xsl:for-each>
</xsl:for-each>


 smile Неужели это так трудно? 
У меня получается следующий вывод:

Код

This is a test table. 
  Sector 1 s1 
Subsector 1s1u1  везде s1 - в случае первого сектора все ок
Subsector 2s1u2 
Subsector 3s1u3 
Subsector 4s1u4 
Subsector 5s1u5 
  Sector 2 s2 
Subsector 1s1u1  а тут уже должен 5 раз быть s2
Subsector 2s1u2 
Subsector 3s1u3 
Subsector 4s1u4 
Subsector 5s1u5 
  Sector 3 s3 
Subsector 1s1u1   и тут уже должен 5 раз быть s3
Subsector 2s1u2 
Subsector 3s1u3 
Subsector 4s1u4 
Subsector 5s1u5


И как я уже не изворачиваюсь.. все никак не получается. А использовать /data/sector[1]/@id - это же не здорово...
Если бы можно было бы, к примеру  /data/sector[i]/@id, а в i заносить каждый шаг цикла sector значение сектора, чтобы в подсекторе
принимать его выводить соответствующие сектор как надо. 

Автор: JVM 16.1.2008, 10:18
Цитата(Мурлыкатам_ @  15.1.2008,  17:00 Найти цитируемый пост)
  Неужели это так трудно? 

Это не трудно, но для решения проблемы нужен исходный XML(который ты удалил) и понимать какой результат нужен.

ЗЫ: Тот XSLT, который ты привел полная чушь и в нем не хочется разбираться.

Автор: maxim1000 16.1.2008, 12:01
ну так сохрани его в переменную:
Код

<xsl:variable name="qqq" select="@id"/>

а потом используй:
Код

<xsl:value-of select="$qqq"/>

Автор: Мурлыкатам_ 16.1.2008, 12:09
Входной документ:
Код

<data>
    <item id="i1" sector="s1" subsector="u1">561</item>
    <item id="i10" sector="s3" subsector="u4">15</item>
    <item id="i22" sector="s2" subsector="u2">1234</item>
    <item id="i11" sector="s1" subsector="u2">123</item>
    <item id="i17" sector="s1" subsector="u3">165</item>
    <item id="i61" sector="s2" subsector="u1">346</item>
    <item id="i12" sector="s2" subsector="u5">3425</item>
    <item id="i2" sector="s3" subsector="u4">78</item>
    <item id="i14" sector="s3" subsector="u4">51</item>
    <item id="i21" sector="s1" subsector="u5">346</item>
    <item id="i39" sector="s3" subsector="u2">463</item>
    <item id="i44" sector="s2" subsector="u3">151</item>
    <item id="i89" sector="s1" subsector="u1">451</item>
    <item id="i81" sector="s2" subsector="u4">771</item>
    <item id="i36" sector="s2" subsector="u5">5654</item>
    <item id="i27" sector="s3" subsector="u3">362</item>
    <item id="i15" sector="s1" subsector="u5">234</item>
    <item id="i18" sector="s3" subsector="u2">73</item>
    <item id="i51" sector="s3" subsector="u5">567</item>
    <item id="i254" sector="s2" subsector="u6">641</item>
    <item id="i255" sector="s4" subsector="u4">314</item>
    <sector id="s1">Sector 1</sector>
    <sector id="s2">Sector 2</sector>
    <sector id="s3">Sector 3</sector>
    <subsector id="u1">Subsector 1</subsector>
    <subsector id="u2">Subsector 2</subsector>
    <subsector id="u3">Subsector 3</subsector>
    <subsector id="u4">Subsector 4</subsector>
    <subsector id="u5">Subsector 5</subsector>
</data>


На выходе надо получить:

This is a test table. 
Sector 1 s1            <-- шаг верхнего цикла, надо как-то на каждом шаге сделать, чтобы мона было эту s1 взять во вложенном цикле.
Subsector 1 s1 u1 
Subsector 2 s1 u2 
Subsector 3 s1 u3 
Subsector 4 s1 u4 
Subsector 5 s1 u5 
 
Sector 2 s2 
Subsector 1 s1 u1   <-- тут надо s2
Subsector 2 s1 u2 
Subsector 3 s1 u3 
Subsector 4 s1 u4 
Subsector 5 s1 u5 
 
Sector 3 s3    
Subsector 1 s1 u1   <-- тут надо s3 (шаг вложенного цикла)
Subsector 2 s1 u2 
Subsector 3 s1 u3 
Subsector 4 s1 u4 
Subsector 5 s1 u5 

maxim1000, 
Цитата(maxim1000 @  16.1.2008,  12:01 Найти цитируемый пост)
ну так сохрани его в переменную:Разметка XML1:<xsl:variable name="qqq" select="@id"/>а потом используй:<xsl:value-of select="$qqq"/>


И можно будет переопределять значение этой переменной каждый шаг первого цикла?

Точно, сработало  smile  +1

Автор: maxim1000 16.1.2008, 14:35
Цитата(Мурлыкатам_ @  16.1.2008,  12:09 Найти цитируемый пост)
И можно будет переопределять значение этой переменной каждый шаг первого цикла?

если быть более точным, это будет каждый раз новая переменная
название variable вообще путает: в xsl нельзя менять значение переменной после первого задания внутри xsl:variable

Автор: Мурлыкатам_ 16.1.2008, 20:57
А может вы знаете какой-нить стандартный алгоритм, который разбивает выходной документ на страницы?
Т.е. после каждого 25 го элемента вложенного цикла надо поместить такой тэг:

Код

<span style="page-break-before: always"></span>


Т.е. после каждого Subsector будет по 6 - 20 значений элемента item, и по условию надо сделать так, чтобы на одной странице было не больше 25 item, причем
Код

<span style="page-break-before: always"></span>

 можно вставить только после sector / subsector. 

Как я понимаю, надо делать переменную, которая будет содержать кол-во выведеных строк с item, и при переборе 25 строк, будет вставлять разрыв страницы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)