Подсчитайте количество детей у ребенка с большим количеством детей.

У меня такой код:

    <Parent>
        <Map sourcename="ItemAName" destinationname="itemaname">
            <Assignment source="Test.OrderA.ItemA" destination="Test.OrderB.ItemA" sourcename="ItemAName" destinationname="ITEMANAME" description="descript3" mandatory="False"/>
            <Assignment source="Test.OrderB.ItemA" destination="Test.OrderC.ItemA" sourcename="ITEMANAME" destinationname="itemaname" description="descript3" mandatory="False"/>
        </Map>
        <Map sourcename="ItemAQuantity" destinationname="itemaquantity">
            <Assignment source="Test.OrderA.ItemA" destination="Test.OrderB.ItemA" sourcename="ItemAQuantity" destinationname="ITEMAQUANTITY" description="descript4" mandatory="False"/>
            <Assignment source="Test.OrderB.ItemA" destination="Test.OrderC.ItemA" sourcename="ITEMAQUANTITY" destinationname="itemaquantity" description="descript4" mandatory="False"/>
            <Assignment source="Test.OrderC.ItemA" destination="Test.OrderD.ItemA" sourcename="itemaquantity" destinationname="ItEmQuAnTiTy" description="descript4" mandatory="False"/>
        </Map>
    </Parent>

В этом случае я хочу отобразить таблицу, содержащую 6 столбцов (количество назначений на карте, которая содержит больше детей * 2). Иногда требуется больше или меньше, согласно данным в файле xml. Если я добавлю еще одну карту с четырьмя назначениями, в таблице должно быть 8 столбцов.

Я использую это:

    <xsl:template match="Map">
        <xsl:if test="position() = 1">
            <tr class="bold">
                <xsl:for-each select="Assignment">
                    <td><xsl:value-of select="@source"/></td>
                    <td><xsl:value-of select="@destination"/></td>
                </xsl:for-each>
            </tr>
         </xsl:if>
         <tr>       
            <xsl:apply-templates select="Assignment"/>  
         </tr>
    </xsl:template> 

    <xsl:template match="Assignment">
        <td><xsl:value-of select="@sourcename" /></td>
        <td><xsl:value-of select="@destinationname" /></td>
    </xsl:template>

Я знаю, что не должен использовать if, чтобы проверить, является ли оно первой позицией. Мне нужен способ подсчитать количество заданий у ребенка, у которого больше заданий.

Есть ли способ сделать это?


person Th3B0Y    schedule 05.02.2014    source источник
comment
Почему бы вам просто не создать <tr> для каждого <Map> и <td> для каждого <Assignment>? Таблицы HTML уже будут использовать максимальное количество столбцов, которое используется в любой из строк.   -  person Erwin Bolwidt    schedule 05.02.2014
comment
@ErwinBolwidt, это актуальный код (я здесь обновил). Я разместил только часть заголовка, которую хочу исправить. Но так как это вызывает больше вопросов, я только что обновил его остальными.   -  person Th3B0Y    schedule 05.02.2014
comment
xslt-1.0 и xslt-2.0 - эксклюзивные теги. Скажите, с какой версией вы работаете, и удалите одну из них.   -  person Mathias Müller    schedule 05.02.2014
comment
Будут ли пустые столбцы в определенной строке всегда находиться в конце, другими словами, возможно ли, чтобы одна строка содержала элементы A и B, а другая - B и C (так что вам понадобятся три набора столбцов A, B и C всего)?   -  person Ian Roberts    schedule 05.02.2014
comment
похоже, вам нужно найти максимальное количество назначений на карте stackoverflow.com/questions/1079715/ и цикл подсчета stackoverflow.com/questions/9076323/xslt-looping-from-1-to-60 от 1 до этого максимума для создания заголовков столбцов. Оба варианта довольно сложны в xslt 1.0, но выполнимы в xslt 2.0. Уже поздно, если еще никто не ответил, завтра проверю   -  person Erwin Bolwidt    schedule 05.02.2014


Ответы (2)


Полагаю, вам нужно что-то вроде этого:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xml:space="default" exclude-result-prefixes="" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" omit-xml-declaration="no" indent="yes" />
  <xsl:template match="Parent">
    <xsl:choose>
      <xsl:when test="count(./Map[@sourcename='ItemAName']/Assignment) &gt; count(./Map[@sourcename='ItemAQuantity']/Assignment)">
        Work on the map named ItemAName
    </xsl:when>
      <xsl:otherwise>
       Work on the map named ItemAQuantity
    </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>
person Thomas Weller    schedule 05.02.2014
comment
Вы предполагаете, что их будет только два, хотя OP сказал: Если я добавлю еще одну карту с четырьмя назначениями, в таблице должно быть 8 столбцов. - person michael.hor257k; 06.02.2014
comment
Ты прав. Я неверно истолковал это и подумал, что одна из карт будет изменена на 4 элемента, но неизвестно, какая карта изменится. Спасибо за разъяснения. - person Thomas Weller; 06.02.2014

Мне нужен способ подсчитать количество заданий у ребенка, у которого больше заданий.

Я предлагаю вам поместить это на верхний уровень вашей таблицы стилей:

<xsl:variable name="columns">
    <xsl:for-each select="/Parent/Map">
    <xsl:sort select="count(Assignment)" data-type="number" order="descending"/>
    <xsl:if test="position()=1">
        <xsl:value-of select="2*count(Assignment)"/>
    </xsl:if>
    </xsl:for-each>
</xsl:variable>

Теперь у вас есть количество необходимых столбцов в переменной $ columns, и вы можете приступить к их созданию. При желании можно указать переменной скопировать фактическую карту с наибольшим количеством назначений, чтобы можно было перебирать их при создании столбцов.

person michael.hor257k    schedule 06.02.2014