0

我正在使用像这样生成 XML 的测试工具

    <detail>
        <results>
            <component>A</component>
            <test>
                <property>performance</property>
                <result>FAIL</result>
            </test>
            <test>
                <property>memory</property>
                <result>PASS</result>
            </test>
        </results>

        <results>
            <component>B</component>
            <test>
                <property>files</property>
                <result>PASS</result>
            </test>
            <test>
                <property>handles</property>
                <result>FAIL</result>
            </test>
        </results>
    </detail>

请注意,每个结果元素包含 1 个组件元素和 0-*测试元素。我想获取每个细节>结果>组件细节>结果>测试>属性的文本,其中细节>结果>测试>结果文本为“失败”。

是否有可以执行此操作的 XPath 表达式?

如果没有,是否有一个简单的 XSLT 可以将示例转换为我可以导入到电子表格中的内容,例如

  A,performance,FAIL
  A,memory,PASS
  B,files,PASS
  B,handles,FAIL
4

3 回答 3

4

此 Xpath 将为您提供失败的属性:

//detail/results/test[result = 'FAIL']/property

这将为您提供部分失败的组件的名称:

//detail/results[test/result = 'FAIL']/component

结合这些,您可以找到所有失败的结果:

//detail/results[test/result = 'FAIL']

然后在其中迭代以获取该结果中的所有失败测试并返回失败的属性:

$result/test[result = 'FAIL']/property

我还没有在一台可以测试 XSL 的机器上,但是从上面的 XPath 中将一个放在一起应该不难。

于 2013-06-19T04:54:13.787 回答
1

我建议apply-template在 for-each 之前更喜欢“模板匹配”。

因此试试这个:

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

    <xsl:template match="detail">
        <xsl:apply-templates select="results[test/result='FAIL']/test" />
    </xsl:template>

    <xsl:template match="results/test">
        <xsl:value-of select="../component"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="property"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="result"/>
        <xsl:text>&#10;</xsl:text>  
    </xsl:template>

</xsl:stylesheet>
于 2013-06-19T05:54:56.413 回答
1

当以下变换

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

<xsl:template match="detail">
    <xsl:for-each select="results">
<xsl:for-each select="test">
<xsl:value-of select="preceding-sibling::component"/><xsl:text>,</xsl:text>
<xsl:value-of select="child::property"/><xsl:text>,</xsl:text>
<xsl:value-of select="child::result"/><xsl:text>&#10;</xsl:text>
</xsl:for-each>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

在以下 XML 上运行

<detail>
        <results>
            <component>A</component>
            <test>
                <property>performance</property>
                <result>FAIL</result>
            </test>
            <test>
                <property>memory</property>
                <result>PASS</result>
            </test>
        </results>

        <results>
            <component>B</component>
            <test>
                <property>files</property>
                <result>PASS</result>
            </test>
            <test>
                <property>handles</property>
                <result>FAIL</result>
            </test>
        </results>
</detail>

给出所需的输出:

A,performance,FAIL
A,memory,PASS
B,files,PASS
B,handles,FAIL
于 2013-06-19T05:07:49.307 回答