Построение таблицы на основе дочерних значений

Привет я пытаюсь вернуть таблицу на основе образца следующего ввода:

<Table TableLevel="1" TableNumber="1" TableTitle="">
  <TableRow TableRowLevel="1" RowTitle="" TableRowNumber="1" class="Even">
    <TableHeader width="33" class="tableheadercell">
      <Paragraph>Account Name</Paragraph>
    </TableHeader>
    <TableHeader width="10" class="tableheadercell">
      <Paragraph>Type</Paragraph>
    </TableHeader>
    <TableHeader width="57" class="tableheadercell">
      <Paragraph>Additional Information</Paragraph>
    </TableHeader>
  </TableRow>
  <TableRow TableRowLevel="1" RowTitle="" TableRowNumber="2" class="OddLegacy">
    <TableCell>
      <Paragraph>ANONYMOUS LOGON</Paragraph>
    </TableCell>
    <TableCell>
      <Paragraph>Group</Paragraph>
    </TableCell>
    <TableCell>
      <UnorderedList UnorderedListLevel="1" class="compactList" UnorderedListNumber="1">
        <ListItem>comment: ANONYMOUS LOGON</ListItem>
        <ListItem>group-id: 7</ListItem>
      </UnorderedList>
    </TableCell>
  </TableRow>
  <TableRow TableRowLevel="1" RowTitle="" TableRowNumber="3" class="Even">
    <TableCell>
      <Paragraph>Administrators</Paragraph>
    </TableCell>
    <TableCell>
      <Paragraph>Group</Paragraph>
    </TableCell>
    <TableCell>
      <UnorderedList UnorderedListLevel="1" class="compactList" UnorderedListNumber="1">
        <ListItem>group-id: 544</ListItem>
      </UnorderedList>
    </TableCell>
  </TableRow>
</Table>

Тогда мой XSLT:

<xsl:variable name="whiteuserxml">
    <item>ANONYMOUS LOGON</item>
</xsl:variable>
<xsl:for-each select="Table">
    <table>
    <xsl:for-each select="TableRow[not(TableCell/Paragraph = $whiteuserxml/item)]">
        <xsl:choose>
        <xsl:when test="count(TableCell) = 0"/>
        <xsl:otherwise>
            <tr>
            <xsl:for-each select="TableHeader">
                <td><b><xsl:apply-templates select="*"/></b></td>
            </xsl:for-each>
            <xsl:for-each select="TableCell">
                        <td><xsl:apply-templates select="*"/></td>
            </xsl:for-each>
               </tr>
        </xsl:otherwise>
        </xsl:choose>
    </xsl:for-each>
    </table>
</xsl:for-each>

Желаемый результат:

<table>
    <tr>
        <td>Administrators</td><td>Group</td><td>the other stufflist</td>
    </tr>
</table>

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

1 ответ

Решение

Вы можете переместить этот выбор вверх на уровне таблицы и проверить, содержит ли он ячейки

<xsl:when test="count(TableRow/TableCell) = 0"/>

Обзор: Хорошо, с условиями "белого списка", все еще перемещая условие вверх

<xsl:for-each select="Table[count(TableRow[not(TableCell/Paragraph = $whiteuserxml/item)]/TableCell)=0]">...
</xsl:when>

вам придется снова фильтровать во внутреннем цикле.

Дело в том, что вы можете создавать сложные условия с помощью xslt/xpath, которые смотрят вперед (или в другие направления) в дереве данных. Вы не ограничены текущим узлом и атрибутами

Другие вопросы по тегам