通过XSLT操作XML值

时间:2012-10-20 03:41:26

标签: xml xslt

以下是<Validation>标记可以包含{... 1}个<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方法,但它已经烟消云散了。

请您分享一下代码片段以计算百分比总和?

1 个答案:

答案 0 :(得分:1)

<强>予。有不同的XSLT 1.0解决方案:

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

0.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

<强> II。 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