Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm XSLT:如何计算属性,在stringmatch中找到_Algorithm_Xslt_Search_Wildcard_Xslt 2.0 - Fatal编程技术网

Algorithm XSLT:如何计算属性,在stringmatch中找到

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

我不熟悉用xslt编写代码。我希望xsl代码查看xml文件中的每个节点/属性,并搜索“_uu(string)”和计数“result=success/failed”。我在这个网站上找到了一条线索来帮助我:
我使用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。非常感谢您的回答。它解决了我的问题!太棒了!:)