Построение таблицы на основе дочерних значений
Привет я пытаюсь вернуть таблицу на основе образца следующего ввода:
<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, которые смотрят вперед (или в другие направления) в дереве данных. Вы не ограничены текущим узлом и атрибутами