获取兄弟节点值的XPath

时间:2013-06-19 04:34:56

标签: xslt xpath

我正在使用像这样生成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- * test 元素。我想获取每个详细信息&gt;结果&gt;组件详细信息&gt;结果&gt; test&gt;属性的文本,其中详细信息&gt;结果&gt; test&gt;结果文字是'失败'。

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

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

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

3 个答案:

答案 0 :(得分: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中放一个应该不难。

答案 1 :(得分: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

答案 2 :(得分:1)

我建议在for-each之前选择“模板匹配”和apply-template

因此尝试这个:

<?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>