2

以下是<Validation>标签可以有 1....n 个<Failed>标签的 XML。

<Header>
    ...
    ...
</Header>
 <Validation>
    <Type>Classic</Type> 
    <Percentage>10</sPercentage> 
     <Failed>
          <ID>CS-20192018</ID> 
          <Department>MF404</Department> 
          <ErrorDescription>Failed at server</ErrorDescription> 
     </Failed>
     <Failed>
          <ID>CS-3233333</ID> 
          <Department>MF404</Department> 
          <ErrorDescription>Failed at webservice</ErrorDescription> 
     </Failed>
  </Validation>
 <Validation>
      <Type>CheckMember</Type> 
      <Percentage>20</Percentage> 
      <Failed>
          <ID>CS-4648902</ID> 
          <Department>MF404</Department> 
          <ErrorDescription>Data not available</ErrorDescription> 
      </Failed>
  </Validation>

要求

我只是想根据<Failed>计数总结百分比。

第一个<Validation>标签:

Percentage * no of <Failed> count = Result1
10 * 2 = 20

第二个<Validation>标签:

Percentage * no of <Failed> count = Result2
20 * 1 = 20

Total = Result1 + Result2 = 20 + 20 = 40

因此,我想将总百分比输出设为 40,并且我尝试了xsl:call-template方法,但它化为乌有。

你能分享我计算百分比总和的代码片段吗?

4

1 回答 1

1

I. 有多种可能的 XSLT 1.0 解决方案

.1。非递归,使用xxx:node-set()函数:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common">

 <xsl:output method="text"/>
 
 <xsl:template match="/">
  <xsl:variable name="vrtfResults">
    <xsl:apply-templates/>
  </xsl:variable>
  
  <xsl:value-of select="sum(ext:node-set($vrtfResults)/*)"/>
 </xsl:template>
 
 <xsl:template match="Validation">
  <x><xsl:value-of select="Percentage * count(Failed)"/></x>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时(更正为格式正确):

<t>
    <Header>
    ...
    ...
    </Header>
    <Validation>
        <Type>Classic</Type>
        <Percentage>10</Percentage>
        <Failed>
            <ID>CS-20192018</ID>
            <Department>MF404</Department>
            <ErrorDescription>Failed at server</ErrorDescription>
        </Failed>
        <Failed>
            <ID>CS-3233333</ID>
            <Department>MF404</Department>
            <ErrorDescription>Failed at webservice</ErrorDescription>
        </Failed>
    </Validation>
    <Validation>
        <Type>CheckMember</Type>
        <Percentage>20</Percentage>
        <Failed>
            <ID>CS-4648902</ID>
            <Department>MF404</Department>
            <ErrorDescription>Data not available</ErrorDescription>
        </Failed>
    </Validation>
</t>

产生了想要的正确结果

40

.2. 使用原始递归:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common">
    <xsl:output method="text"/>
    
    <xsl:template match="/*">
            <xsl:apply-templates select="Validation[1]"/>
    </xsl:template>
    
    <xsl:template match="Validation[following-sibling::Validation]">
     <xsl:param name="pSum" select="0"/>
     
     <xsl:apply-templates select="following-sibling::Validation[1]">
       <xsl:with-param name="pSum" select="$pSum +Percentage*count(Failed)"/>
     </xsl:apply-templates>
    </xsl:template>
    
    <xsl:template match="Validation">
     <xsl:param name="pSum" select="0"/>
   <xsl:value-of select="$pSum +Percentage*count(Failed)"/>
    </xsl:template>
</xsl:stylesheet>

当此转换应用于同一个 XML 文档(如上)时,会产生相同的正确结果

40

二、XSLT 2.0 (XPath 2.0) 解决方案

以下也可以指定为根本不需要 XSLT 的单个 XPath 2.0 表达式

<xsl:stylesheet version="2.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    
 <xsl:template match="/*">
     <xsl:sequence select="sum(Validation/(Percentage*count(Failed)))"/>
 </xsl:template>
</xsl:stylesheet>

还会产生想要的正确结果

40
于 2012-10-20T03:56:41.213 回答