2

ある期間内に特定の基準に一致するノードの数のカウントを示すレポートに変換したいXMLがあります。

以下のxmlの例。日付範囲内のステータスに基づいてノードの数を表示しようとしています。

日付範囲に基づいて照合できますが、その範囲内のステータスカウントを表示するのに問題があります。どんなポインタでもありがたいです。

    <?xml version="1.0" encoding="UTF-8"?>
    <List>
     <Item>
       <Value name="Status">Open</Value>    
       <Value name="Date">2012-09-01</Value>
       <Value name="Name">Item 1</Value>
     </Item>
     <Item>
       <Value name="Status">Open</Value> 
       <Value name="Date">2012-10-15</Value>
       <Value name="Name">Item 2</Value>
     </Item>
     <Item>
       <Value name="Status">Open</Value> 
       <Value name="Date">2012-10-15</Value>
       <Value name="Name">Item 3</Value>
     </Item>
     <Item>
       <Value name="Status">Pending</Value> 
       <Value name="Date">2012-10-20</Value>
       <Value name="Name">Item 4</Value>
     </Item>
     <Item>
       <Value name="Status">Closed</Value>
       <Value name="Date">2012-10-30</Value>
       <Value name="Name">Item 5</Value>
     </Item>
    </List>

出力例は次のようになります:-

   Status         2012-10-01 - 2012-10-31
   Open           2
   Closed         1
   Pending        1
4

1 に答える 1

1

これと同じくらい簡単です:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pStartDate" select="20121001"/>
 <xsl:param name="pEndDate" select="20121031"/>

 <xsl:template match="/">
   <xsl:variable name="vInRange" select=
    "/*/*[translate(Value[@name='Date'],'-','') >= $pStartDate
         and
          $pEndDate >= translate(Value[@name='Date'],'-','')
         ]"/>
     Open      <xsl:value-of select="count($vInRange[Value[@name='Status']='Open'])"/>
     Closed    <xsl:value-of select="count($vInRange[Value[@name='Status']='Closed'])"/>
     Pending   <xsl:value-of select="count($vInRange[Value[@name='Status']='Pending'])"/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合:

<List>
    <Item>
        <Value name="Status">Open</Value>
        <Value name="Date">2012-09-01</Value>
        <Value name="Name">Item 1</Value>
    </Item>
    <Item>
        <Value name="Status">Open</Value>
        <Value name="Date">2012-10-15</Value>
        <Value name="Name">Item 2</Value>
    </Item>
    <Item>
        <Value name="Status">Open</Value>
        <Value name="Date">2012-10-15</Value>
        <Value name="Name">Item 3</Value>
    </Item>
    <Item>
        <Value name="Status">Pending</Value>
        <Value name="Date">2012-10-20</Value>
        <Value name="Name">Item 4</Value>
    </Item>
    <Item>
        <Value name="Status">Closed</Value>
        <Value name="Date">2012-10-30</Value>
        <Value name="Name">Item 5</Value>
    </Item>
</List>

必要な正しい結果が生成されます:

 Open      2
 Closed    1
 Pending   1
于 2012-11-19T17:24:29.583 に答える