代码之家  ›  专栏  ›  技术社区  ›  VitalyB

减少XSLT1.0中的重复表达式

  •  3
  • VitalyB  · 技术社区  · 14 年前

    <?xml version="1.0" encoding="utf-8"?>
    <TestCases>
      <TestCase>
        <Name>Test1</Name>
        <Result>Failed</Result>
        <Properties>
          <Type>Type1</Type>
        </Properties>
      </TestCase>
      <TestCase>
        <Name>Test1</Name>
        <Result>Failed</Result>
        <Properties>
          <Type>Type2</Type>
        </Properties>
      </TestCase>
      <TestCase>
        <Name>Test1</Name>
        <Result>Passed</Result>
        <Properties>
          <Type>Type1</Type>
        </Properties>
      </TestCase>
    </TestCases>
    

    我有兴趣创建一个表,根据测试用例的类型统计通过/失败的测试用例的数量,如下所示:

    通过(类型1):1 失败(类型1):1 已通过(其他类型):0 失败(其他类型):1

    <xsl:value-of select="count(//TestCase[Result = 'Passed' and count(Properties/TestType='Type1')>0])"/>
    <xsl:value-of select="count(//TestCase[Result = 'Failed' and count(Properties/TestType='Type1')>0])"/>
    <xsl:value-of select="count(//TestCase[Result = 'Passed' and count(Properties/TestType='Type1')=0])"/>
    <xsl:value-of select="count(//TestCase[Result = 'Failed' and count(Properties/TestType='Type1')=0])"/>
    

    注意,这是对实数的简化,虽然表达式在这里看起来并不长,但在实数代码中它相当长,所以需要是相当真实的。

    2 回复  |  直到 14 年前
        1
  •  3
  •   user357812 user357812    14 年前

    尝试:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    
        <xsl:key name="byType" match="Properties/Type" use="."/> 
    
        <xsl:template match="text()" /> 
    
        <xsl:template match="Type[count(.|key('byType',.)[1])=1]"> 
            <xsl:value-of select="concat(' Passed (',.,'): ',
                                          count(key('byType',.)[../../Result='Passed']),
                                          ' Failed (',.,'): ',
                                          count(key('byType',.)[../../Result='Failed']))" /> 
        </xsl:template>  
    
    </xsl:stylesheet> 
    

    你会得到:

     Passed (Type1): 1 Failed (Type1): 1 Passed (Type2): 0 Failed (Type2): 1
    

    编辑

        2
  •  1
  •   Dimitre Novatchev    14 年前

    除了使用Muenchian方法对bu@Alejandro进行分组的优秀解决方案之外,这里还演示了变量的使用 :

    这种转变:

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="text"/>
    
     <xsl:variable name="vPassed"
          select="/*/*[Result = 'Passed']"/>
    
     <xsl:variable name="vFailed"
          select="/*/*[Result = 'Failed']"/>
    
     <xsl:template match="/">
      <xsl:value-of select=
       "concat('Passed (Type1): ',
               count($vPassed[Properties/Type='Type1']),
               ' Failed (Type1): ',
               count($vFailed[Properties/Type='Type1']),
               ' Passed (Other types): ',
               count($vPassed[not(Properties/Type='Type1')]),
               ' Failed (Other types): ',
               count($vFailed[not(Properties/Type='Type1')])
              )
       "/>
     </xsl:template>
    </xsl:stylesheet>
    

    应用于提供的XML文档时

    <TestCases>
      <TestCase>
        <Name>Test1</Name>
        <Result>Failed</Result>
        <Properties>
          <Type>Type1</Type>
        </Properties>
      </TestCase>
      <TestCase>
        <Name>Test1</Name>
        <Result>Failed</Result>
        <Properties>
          <Type>Type2</Type>
        </Properties>
      </TestCase>
      <TestCase>
        <Name>Test1</Name>
        <Result>Passed</Result>
        <Properties>
          <Type>Type1</Type>
        </Properties>
      </TestCase>
    </TestCases>
    

    :

    Passed (Type1): 1 Failed (Type1): 1 Passed (Other types): 0 Failed (Other types): 1