Algorithm XSLT:如何计算属性,在stringmatch中找到
我不熟悉用xslt编写代码。我希望xsl代码查看xml文件中的每个节点/属性,并搜索“_uu(string)”和计数“result=success/failed”。我在这个网站上找到了一条线索来帮助我:Algorithm XSLT:如何计算属性,在stringmatch中找到,algorithm,xslt,search,wildcard,xslt-2.0,Algorithm,Xslt,Search,Wildcard,Xslt 2.0,我不熟悉用xslt编写代码。我希望xsl代码查看xml文件中的每个节点/属性,并搜索“_uu(string)”和计数“result=success/failed”。我在这个网站上找到了一条线索来帮助我: 我使用xsl代码查找字符串匹配项。但我的问题是,我不知道如何编写代码来计算给定stringmatch的成功与失败?我希望输出像这样: **(Casename)** | **(total success)** | **(total failed)** __(stringm
我使用xsl代码查找字符串匹配项。但我的问题是,我不知道如何编写代码来计算给定stringmatch的成功与失败?我希望输出像这样:
**(Casename)** | **(total success)** | **(total failed)**
__(stringmatch1)| 2 | 0
__(stringmatch2)| 0 | 2
以下是xml文件的示例:
<report>
<programtest user="testuser">
<programtest software="test">
<programtest testname="SW log">
</programtest>
<programtest testname="HW log">
</programtest>
<programtest testname="loop_program_test">
<programtest casename="test" iteration="1" result="success">
<programtest casename="__temp1" type="specifictestcase" result="success" >
</programtest>
<programtest casename="__temp2" type="specifictestcase" result="failed" >
</programtest>
</programtest>
<programtest casename="test" iteration="2" result="success">
<programtest casename="__temp1" type="specifictestcase" result="success" >
</programtest>
<programtest casename="__temp2" type="specifictestcase" result="failed" >
</programtest>
</programtest>
</programtest>
</programtest>
</programtest>
</report>
感谢您的帮助!:-) 做得好
<xsl:variable name="matchedElements" select="//*[starts-with(@casename, '__')]"/>
<xsl:variable name="unmatchedElements" select="//*[not(starts-with(@casename, '__'))]"/>
您可以找到元素,然后根据需要输出数字,例如
<table>
<thead>
<tr>
<th>matched</th>
<th>not matched</th>
</tr>
</thead>
<tbody>
<tr>
<td><xsl:value-of select="count($matchedElements)"/></td>
<td><xsl:value-of select="count($unmatchedElements)"/></td>
</tr>
</tbody>
</table>
匹配
不匹配
这有用吗
我只是简单地使用了
以(@casename,'.''.''.'
开头,根据您的需要,您当然可以使用其他测试,如@casename='.''.''.'''.'''.'temp1'
或匹配(@casename,'这里有一些正则表达式模式')
我认为这是一个分组问题。您需要根据@casename属性为每个特定的programtest元素对结果进行分组。在XSLT2.0中,可以通过xsl:for each group元素来实现这一点
<xsl:for-each-group select=".//programtest[@type='specifictestcase']" group-by="@casename">
然后,对于每个小组,你会得到这样的成功次数
<xsl:value-of select="count(current-group()[@result='succes'])"/>
(注意,您的XML中可能有输入错误,不应该是“success”而不是“success”?)
这是完整的XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/report">
<table>
<tr>
<th>**(Casename)**</th>
<th>**(total success)**</th>
<th>**(total failed)**</th>
</tr>
<xsl:for-each-group select=".//programtest[@type='specifictestcase']" group-by="@casename">
<tr>
<td>
<xsl:value-of select="current-grouping-key()"/>
</td>
<td>
<xsl:value-of select="count(current-group()[@result='succes'])"/>
</td>
<td>
<xsl:value-of select="count(current-group()[@result='failed'])"/>
</td>
</tr>
</xsl:for-each-group>
</table>
</xsl:template>
</xsl:stylesheet>
**(案件名称)**
**(全部成功)**
**(全部失败)**
当应用于示例XML时,将输出以下内容
<table>
<tr>
<th>**(Casename)**</th>
<th>**(total success)**</th>
<th>**(total failed)**</th>
</tr>
<tr>
<td>__temp1</td>
<td>2</td>
<td>0</td>
</tr>
<tr>
<td>__temp2</td>
<td>0</td>
<td>2</td>
</tr>
</table>
**(案件名称)**
**(全部成功)**
**(全部失败)**
__temp1
2.
0
__临时2
0
2.
谢谢,这是一个好的开始。不过,我的下一个问题是,区分“uuu(stringmatches)”,这听起来是一个很好的方法。是的,你的权利,这是一个打字错误。但是尝试这样做会给我一个错误,即我的xml编辑器无法识别“for each group”扩展。我使用VS2010作为xml编辑器,并确保我使用的是XSLT v 2.0。如果您使用的是Visual Studio,那么您可能需要XSLT v1.0解决方案,因为Microsoft的xml处理器不支持2.0。非常感谢您的回答。它解决了我的问题!太棒了!:)