2016-12-08 9 views
1

私は4家族の7人の子供がいる(非常に奇妙な)XMLを持っています。 リンゴが6個、オレンジが9個、リンゴが3個、オレンジが3個の少女が2人あります。XSLは、兄弟としてキーを持つノードを見つける

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="fruits.xsl"?> 
<report> 
    <family> 
     <gender> 
      <boyorgirl>Boy</boyorgirl> 
       <person> 
        <apples>1</apples> 
        <oranges>1</oranges> 
        <id>1</id> 
       </person> 
     </gender> 
     <gender> 
      <boyorgirl>Girl</boyorgirl> 
       <person> 
        <apples>2</apples> 
        <oranges>0</oranges> 
        <id>2</id> 
       </person> 
     </gender> 
     <gender> 
      <boyorgirl>Boy</boyorgirl> 
       <person> 
        <apples>1</apples> 
        <oranges>4</oranges> 
        <id>3</id> 
       </person> 
     </gender> 
    </family> 
    <family> 
     <gender> 
      <boyorgirl>Girl</boyorgirl> 
       <person> 
        <apples>1</apples> 
        <oranges>3</oranges> 
        <id>4</id> 
       </person> 
     </gender> 
    </family> 
    <family> 
     <gender> 
      <boyorgirl>Boy</boyorgirl> 
       <person> 
        <apples>1</apples> 
        <oranges>0</oranges> 
        <id>5</id> 
       </person> 
     </gender> 
    </family> 
    <family> 
     <gender> 
      <boyorgirl>Boy</boyorgirl> 
       <person> 
        <apples>2</apples> 
        <oranges>2</oranges> 
        <id>6</id> 
       </person> 
       <person> 
        <apples>1</apples> 
        <oranges>2</oranges> 
        <id>7</id> 
       </person> 
     </gender> 
    </family> 
</report> 

性別ごとにいくつの人がいるのか、彼らが一緒に持っているリンゴとオレンジがどれくらいあるかをカウントしたいと思います。 男の子や女の子以外の性別があると主張する必要がある場合に備えて、現代の性別をハードコードしたくありません。予想される出力は

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<fruitcounting xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <fruitline> 
     <boyorgirl>Boy</boyorgirl> 
     <numberOfPersons>5</numberOfPersons> 
     <apples>6</apples> 
     <oranges>9</oranges> 
    </fruitline> 
    <fruitline> 
     <boyorgirl>Girl</boyorgirl> 
     <numberOfPersons>2</numberOfPersons> 
     <apples>3</apples> 
     <oranges>3</oranges> 
    </fruitline> 
</fruitcounting> 

である私は、スタイルシートの始まりを持っていますが、それだけで最初の家族にメンバーや果物をカウント - 私はそれを変更することができますどのようにそれは関係なく、家族の、すべての男の子/女の子見つけましたか?あるいは、前の兄弟としてキーを持つすべてのノードとしてそれを定式化することができると思います。

私はあなたが、例えば、 <numberOfPersons><xsl:value-of select="count(key('fruits', boyorgirl)/person)"/></numberOfPersons><numberOfPersons><xsl:value-of select="count(../gender/person/id)"/></numberOfPersons>を交換し、 key機能をあなたのグループをidenfityするのと同じ方法を使用することができます
<?xml version="1.0"?> 

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

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:key name="fruits" match="gender" use="boyorgirl"/> 

<xsl:template match="/"> 
    <fruitcounting> 

     <xsl:for-each select="//gender[generate-id(.)=generate-id(key('fruits', boyorgirl)[1])]"> 

      <fruitline> 
       <boyorgirl><xsl:value-of select="boyorgirl"/></boyorgirl> 
       <numberOfPersons><xsl:value-of select="count(../gender/person/id)"/></numberOfPersons> 
       <apples><xsl:value-of select="sum(../gender/person/apples)"/></apples> 
       <oranges><xsl:value-of select="sum(../gender/person/oranges)"/></oranges> 

      </fruitline> 

     </xsl:for-each> 
    </fruitcounting> 
</xsl:template> 

</xsl:stylesheet> 

答えて

1

拡張子なしXSL 1.0を使用することができます

他の計算では<apples><xsl:value-of select="sum(key('fruits', boyorgirl)/person/apples)"/></apples>である。

だから、完全なコードはhttp://xsltransform.net/bwdwsbでオンライン

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

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:key name="fruits" match="gender" use="boyorgirl"/> 

<xsl:template match="/"> 
    <fruitcounting> 

     <xsl:for-each select="//gender[generate-id(.)=generate-id(key('fruits', boyorgirl)[1])]"> 

      <fruitline> 
       <boyorgirl><xsl:value-of select="boyorgirl"/></boyorgirl> 
       <numberOfPersons><xsl:value-of select="count(key('fruits', boyorgirl)/person)"/></numberOfPersons> 
       <apples><xsl:value-of select="sum(key('fruits', boyorgirl)/person/apples)"/></apples> 
       <oranges><xsl:value-of select="sum(key('fruits', boyorgirl)/person/oranges)"/></oranges> 

      </fruitline> 

     </xsl:for-each> 
    </fruitcounting> 
</xsl:template> 

</xsl:stylesheet> 

になります。

関連する問題