2

これは別のマインドブロワーです。おそらくあなたにとっては簡単です。

2 つのリストがあります。1 つはアイテム ID をグループ ID に接続するマップで、2 つ目は単純な値を持つアイテム リストです。項目値の数をグループ合計に累積する必要があります。もともと、2 つのリストは異なる XML ファイルに基づいていました。

<!-- List 1 mapping-->
<mapping>
    <sub id="1" item="a" group="a">
    <sub id="2" item="b" group="a">
    <sub id="3" item="d" group="b">
    <sub id="4" item="e" group="b">
    <sub id="5" item="f" group="c">
</mapping>

<!-- List 2 items -->
<items>
    <item id="a" val="OK"/> 
    <item id="b" val="ERROR"/>
    <item id="c" val="OK"/>
    <item id="d" val="OK"/>
    <item id="e" val="OK"/>
    <item id="f" val="OK"/>
</items>

私の現在のアプローチ:

<xsl:variable name="failed-total">

<xsl:variable name="groups-total">
    <xsl:value-of select="count(mapping//sub[not(@group=preceding-sibling::sub/@group)])"/>
</xsl:variable>

<!--Selecting the unique groups of the first list:-->
<xsl:for-each select="mapping//sub[not(@group=preceding-sibling::sub/@group)]">
    <xsl:variable name="failed">
        <xsl:value-of select="items/item[@id=current()/@item and val='ERROR']"/>
    </xsl:variable>

<!-- TODO: add value of failed to failed-total value -->
</xsl:for-each>

必要な出力:

Number of Groups: 3
Groups failed: 1

リスト 2 を次のように変更します。

<!-- List 2 items -->
<items>
    <item id="a" val="ERROR"/> 
    <item id="b" val="ERROR"/>
    <item id="c" val="OK"/>
    <item id="d" val="OK"/>
    <item id="e" val="OK"/>
    <item id="f" val="OK"/>
</items>

次に、同じものを出力する必要があります。原因となる項目 a と be は同じグループに属します。

Number of Groups: 3
Groups failed: 1

どんなヒントでも大歓迎です。

4

2 に答える 2

2

これは、ローカル ファイルから items.xml ドキュメントを読み取る短くてシンプルなソリューション (1 つのテンプレートのみ) です

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:key name="kGroupByVal" match="@group" use="."/>

 <xsl:variable name="vItems" select=
  "document('file:///c:/temp/delete/items.xml')"/>

 <xsl:template match="/">
  <xsl:variable name="vGroups" select=
  "/*/*/@group
          [generate-id()=generate-id(key('kGroupByVal',.)[1])]"/>

  <xsl:variable name="vErrorIds" select=
    "$vItems/*/*[@val='ERROR']/@id"/>

  Number of groups: <xsl:value-of select="count($vGroups)"/>
  Groups failed: <xsl:value-of select=
  "count($vGroups[key('kGroupByVal',.)/../@item = $vErrorIds])"/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメント (マッピング) に適用されると、次のようになります。

<mapping>
    <sub id="1" item="a" group="a"/>
    <sub id="2" item="b" group="a"/>
    <sub id="3" item="d" group="b"/>
    <sub id="4" item="e" group="b"/>
    <sub id="5" item="f" group="c"/>
</mapping>

2 番目に提供された XML ドキュメント (項目) は、次のファイルにあります: C:\temp\delete\items.xml:

<items>
    <item id="a" val="OK"/>
    <item id="b" val="ERROR"/>
    <item id="c" val="OK"/>
    <item id="d" val="OK"/>
    <item id="e" val="OK"/>
    <item id="f" val="OK"/>
</items>

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

  Number of groups: 3
  Groups failed: 1

items.xml ドキュメントを次のように変更すると:

<items>
    <item id="a" val="ERROR"/>
    <item id="b" val="ERROR"/>
    <item id="c" val="OK"/>
    <item id="d" val="OK"/>
    <item id="e" val="OK"/>
    <item id="f" val="OK"/>
</items>

次に、正しい結果が生成されます。

  Number of groups: 3
  Groups failed: 1

items.xml を次のように変更すると:

<items>
    <item id="a" val="ERROR"/>
    <item id="b" val="OK"/>
    <item id="c" val="OK"/>
    <item id="d" val="OK"/>
    <item id="e" val="ERROR"/>
    <item id="f" val="OK"/>
</items>

ここでも正しい結果が生成されます。

  Number of groups: 3
  Groups failed: 2
于 2013-04-18T04:02:33.960 に答える