2016-12-08 9 views
1

У меня есть этот (довольно странный) XML, с 7 детьми из 4 семейств. Есть 5 мальчиков, которые имеют 6 яблок и 9 апельсинов и 2 девочки, у которых есть 3 яблока и 3 апельсина.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> 

У меня есть начало таблицы стилей, но это только подсчитывает членов и фрукты в первой семье - как я могу изменить его так, он находит все мальчики/девочки, независимо от семьи? Или, я думаю, я мог бы сформулировать его как все узлы, у которых есть ключ как предыдущий брат.

я могу использовать только XSL 1,0 без расширений

<?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

Вы можете заменить <numberOfPersons><xsl:value-of select="count(../gender/person/id)"/></numberOfPersons> с <numberOfPersons><xsl:value-of select="count(key('fruits', boyorgirl)/person)"/></numberOfPersons> и использовать функцию key таким же образом, чтобы idenfity ваши группы, например <apples><xsl:value-of select="sum(key('fruits', boyorgirl)/person/apples)"/></apples> в других вычислениях.

Так полный код становится

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

онлайн на http://xsltransform.net/bwdwsb.

Смежные вопросы