2012-05-23 66 views
0

你好我想基于以下输入的采样返回表:大厦数值表

<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

发布XML时,请确保格式一致和格式正确。我添加了缺失的结束标记并重新格式化了XML。 –

+1

您的问题不明确。什么是“空”输入表的样子?它是否还有标题行? “添加表名”是什么意思? –

+0

为了让别人提供帮助,他们需要具备变革必须执行的要求和完整(但尽可能小)的转换,以便重现问题。目前你没有提供这些。我试图运行你的XSLT片段,但它使用未定义的变量。请编辑问题并提供缺少的重要信息。 –

回答

0

可以移动,在表级别的选择,并检查它是否包含细胞

<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构建复杂的条件,这些条件在数据树中向前看(或其他方向)。您不限于当前节点和属性

+0

我不能做数量直到我确保源中的行不在白名单 – Psydone

+0

是的,现在我想我已经有了一条线来证明我正在尝试do: 'count(Section/Section [not(Table/TableRow/TableCell/Paragraph = $ whiteuserxml/item)])' 这个计数有多少节不包含低级子节点某些节点列表 – Psydone