获取遍历子节点的子子属性值以进行首次匹配

时间:2019-02-11 23:47:54

标签: xslt xslt-1.0

每个类具有3个或更多测试方法。

每种测试方法都可以通过或失败。

零,一种或多种方法可能会失败。

要求是遍历测试方法的结果,发现失败的方法(第一个匹配项)时,获取'message'的属性值并打印出来。

如果所有方法均未失败,则打印空白。

我该如何实现?


Input.xml
<testng-results>
<suite>
<test>
    <class name="activities.ActivitiesListTest">
    <test-method status="PASS" started-at="2019-02-07T18:24:47Z" name="initTest">
        <reporter-output>
        </reporter-output>
    </test-method>

    <test-method status="FAIL" started-at="2019-02-07T18:24:47Z" name="ActListsForContactShowsContactRelatedTasksTest">
        <exception class="org.openqa.selenium.NoSuchElementException">
            <message>
                <![CDATA[Element with locator 123 not present']]>
            </message>
        </exception>
        <reporter-output>
        </reporter-output>
    </test-method>

    <test-method status="FAIL" started-at="2019-02-07T18:24:47Z" name="afterClass">
        <exception class="org.openqa.selenium.NoSuchElementException">
        <message>
            <![CDATA[Message 3]]>
        </message>
        </exception>
        <reporter-output>
        </reporter-output>
    </test-method>
</class>
</test>
</suite>
</testng-results>

预期结果:

    <Suite>
    <test failed_reason=" <![CDATA[Element with locator 123 not 
    present']]>"/>
    </Suite>

尝试(XSL):


<Suite>
<xsl:for-each select="/class">
    <test>
        <xsl:attribute name="failed_reason">
            <xsl:choose>
                <xsl:when test="*[@status='FAIL']">test-method[position() = current()]/exception/@message</xsl:when>
            </xsl:choose>
        </xsl:attribute>
    </test>
</xsl:for-each>
</Suite>

示例异常消息的绝对路径:

suite/test/class[@name='ActivitiesListForContactShowsContactRelatedTasksTest']/test-method[@name='ActListsTest']/exception/message

但是,没有用。

如何达到预期效果?

编辑: 尝试迈克尔的解决方案。

这是我的XSL当前的样子:


<xsl:template match="/">
<Suite>
    <xsl:for-each select="testng-results/suite/test/class">
        <test>
            <xsl:attribute name="start-time">
                <xsl:value-of select="test-method[1]/@started-at"/>
            </xsl:attribute>
            <xsl:attribute name="failed_reason">
                {normalize-space(test-method[@status='FAIL'][1]/exception/message)}
            </xsl:attribute>
        </test>
    </xsl:for-each>
</Suite>
</xsl:template>

1 个答案:

答案 0 :(得分:1)

我猜(!)您想做类似的事情:

<xsl:template match="/*">
    <Suite>
        <xsl:for-each select="class">
           <test failed_reason="{normalize-space(test-method[@status='FAIL'][1]/exception/message)}"/>
        </xsl:for-each>
    </Suite>
</xsl:template>

注意:

<xsl:for-each select="/class">
除非class是根元素,否则

将不会选择任何内容。但是,如果class是根元素,则只有一个类-因此,使用xsl:for-each毫无意义。