2

<Validation>以下は、タグが 1....n 個のタグを持つことができるXMLです<Failed>

<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

2 番目<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 に答える