需要XPath:检查特定列的每一行内的值

时间:2015-12-10 10:27:29

标签: xslt xpath

我有一个下面的场景。我需要下面的xpath: 我们有一个表格,其中包含名称,代码和行为。 我们也可能没有代码旁边的空白列。它可以是任何数字。 但表格以姓名开头,以行为结束。

Thead示例:

1) <Row>
        <Cell><Element>Name</Element></Cell>
        <Cell><Element>Code</Element></Cell>
        <Cell><Element>Conduct</Element></Cell>
    </Row>

2)<Row>
        <Cell><Element>Name</Element></Cell>
        <Cell><Element>Code</Element></Cell>
        <Cell><Element></Element></Cell>
        <Cell><Element>Conduct</Element></Cell>
    </Row>

3) <Row>
        <Cell><Element>Name</Element></Cell>
        <Cell><Element>Code</Element></Cell>
        <Cell><Element></Element></Cell>
        <Cell><Element></Element></Cell>
        <Cell><Element>Conduct</Element></Cell>
    </Row>

Tbody的第一行应该在所有列中都有值。主要在Code和Empty thead列中。     Cell也可能包含内部元素Element1。

Tbody First Row示例:

ex 1) <Row>
        <Cell><Element>abc</Element></Cell>
        <Cell><Element>23</Element></Cell>
        <Cell><Element>Good</Element></Cell>
    </Row>

ex 2)<Row>
        <Cell><Element>ttt</Element></Cell>
        <Cell><Element>34</Element></Cell>
        <Cell><Element>45</Element></Cell>
        <Cell><Element>good</Element></Cell>
    </Row>

ex 3) <Row>
        <Cell><Element>yyy</Element></Cell>
        <Cell><Element>22</Element></Cell>
        <Cell><Element>33</Element></Cell>
        <Cell><Element><Element1>4</Element1>4</Element></Cell>
        <Cell><Element>Conduct</Element></Cell>
    </Row>

从第2行开始,我们需要至少检查代码列中的任何一个元素,并且相邻的空列应该具有值。 如果任何一行有值,那么我们应该按照Sample Output1中的说明转换表:(正例)。 ie)表名应改为XYZ,并为Code列和相邻的空列组合所有元素insed单元格。

样本输入1 :(正例)

<Table Name="abc">
<Thead>
    <Row>
        <Cell><Element>Name</Element></Cell>
        <Cell><Element>Code</Element></Cell>
        <Cell><Element></Element></Cell>
        <Cell><Element>Conduct</Element></Cell>
    </Row>
</Thead>
<Tbody>
    <Row>
        <Cell><Element>Sam</Element></Cell>
        <Cell><Element>1</Element><Element>2</Element><Element>1</Element></Cell>
        <Cell><Element>1</Element><Element></Element><Element>1</Element></Cell>
        <Cell><Element>Good</Element></Cell>
    </Row>
    <Row>
        <Cell><Element>xyz</Element></Cell>
        <Cell><Element>123</Element></Cell>
        <Cell><Element></Element><Element></Element><Element><Element1>1<Element1></Element></Cell>
        <Cell><Element>Good</Element></Cell>
    </Row>
</Tbody>
</Table>

示例输出1 :(正例)

<Table Name="XYZ">
<Thead>
    <Row>
        <Cell><Element>Name</Element></Cell>
        <Cell><Element>Code</Element></Cell>
        <Cell><Element></Element></Cell>
        <Cell><Element>Conduct</Element></Cell>
    </Row>
</Thead>
<Tbody>
    <Row>
        <Cell><Element>Sam</Element></Cell>
        <Cell><Element>121</Element></Cell>
        <Cell><Element>11</Element></Cell>
        <Cell><Element>Good</Element></Cell>
    </Row>
    <Row>
        <Cell><Element>TTT</Element></Cell>
        <Cell><Element>123</Element></Cell>
        <Cell><Element>1</Element></Cell>
        <Cell><Element>Good</Element></Cell>
    </Row>
    <Row>
        <Cell><Element>PPP</Element></Cell>
        <Cell><Element>123</Element></Cell>
        <Cell><Element>1</Element></Cell>
        <Cell><Element>Good</Element></Cell>
    </Row>
</Tbody>
</Table>

如果所有行在任何一列中都有空值,那么我们什么都不做。

示例输入2 :(负面情况)

<Table Name="abc">
<Thead>
    <Row>
        <Cell><Element>Name</Element></Cell>
        <Cell><Element>Code</Element></Cell>
        <Cell><Element></Element></Cell>
        <Cell><Element>Conduct</Element></Cell>
    </Row>
</Thead>
<Tbody>
    <Row>
        <Cell><Element>Sam</Element></Cell>
        <Cell><Element>1</Element><Element>2</Element><Element>3</Element></Cell>
        <Cell><Element></Element><Element></Element><Element></Element></Cell>
        <Cell><Element>Good</Element></Cell>
    </Row>
    <Row>
        <Cell><Element>xyz</Element></Cell>
        <Cell><Element>123</Element></Cell>
        <Cell><Element></Element><Element></Element><Element><Element1><Element1></Element></Cell>
        <Cell><Element>Good</Element></Cell>
    </Row>
</Tbody>
</Table>

Sample Output2:(Negative case)
same as input.

我们尝试了什么:

count(Tbody //行[count(./ Cell [2] / Element [number(normalize-space(。))和number(normalize-space(。))&gt; 0])!= 0])

这项工作仅针对“唯一代码”列,但我们不知道将会有多少辅助空列。对于这种情况,我们需要知道xpath。

1 个答案:

答案 0 :(得分:1)

你的描述很难理解,我在这里主要猜测。以下测试是否可以帮助您区分这两种情况?

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="Table">
    <xsl:choose>
        <xsl:when test="Tbody/Row[position() > 1]/Cell[position() > 2 and position() != last()][.//text()]">POSITIVE</xsl:when>
        <xsl:otherwise>NEGATIVE</xsl:otherwise>
    </xsl:choose>
</xsl:template>

</xsl:stylesheet>

这样做是从第2行开始查看正文的每一行,并查看任何单元格中是否有值,从单元格#3开始,到最后一个单元格之前的单元格结束。如果找到任何这样的细胞,结果是积极的。