Я имею в виду, я хочу, чтобы количество было 3. Счет 1 на каждого владельца. Также я
я сталкиваюсь с проблемой, когда у меня есть больше чем один <feeList>
. в
Пример я привел только один, но на самом деле может быть много.
<feeList>
по одному на пользователя, и у меня несколько пользователей
файл. Я думаю, проблема в том, что <xsl:key name="overall" match="userFee" use="owner/Id" />
просматривает весь файл. Могу я
сделать этот ключ просто посмотреть на каждый элемент <feeList>
?
Исходя из этого комментария к другому ответу, мне кажется, что вам нужно использовать составной ключ, используя как владельца / ID, так и пользователя / значение.
Было бы намного легче сказать наверняка, если бы вы обновили свой вопрос примером, который содержит более одного user
и соответствующий feeList
.
Кроме того, для подсчета количества владельцев на пользователя вы можете создать переменную, которая выводит символ строки для каждого владельца. Длина строки будет количеством владельцев. Вероятно, есть гораздо лучший способ сделать это, но сейчас это не приходит в голову.
Полный пример ...
Ввод XML (обновлено, чтобы иметь более одного user
и feeList
)
<Fees>
<user>
<value>userA</value>
</user>
<feeList>
<userFee>
<owner>
<Id>owner1</Id>
</owner>
<Amount>
<sum>100</sum>
</Amount>
</userFee>
<userFee>
<owner>
<Id>owner1</Id>
</owner>
<Amount>
<sum>100</sum>
</Amount>
</userFee>
<userFee>
<owner>
<Id>owner2</Id>
</owner>
<Amount>
<sum>100</sum>
</Amount>
</userFee>
<userFee>
<owner>
<Id>owner3</Id>
</owner>
<Amount>
<sum>100</sum>
</Amount>
</userFee>
</feeList>
<user>
<value>userB</value>
</user>
<feeList>
<userFee>
<owner>
<Id>owner1</Id>
</owner>
<Amount>
<sum>120</sum>
</Amount>
</userFee>
<userFee>
<owner>
<Id>owner2</Id>
</owner>
<Amount>
<sum>100</sum>
</Amount>
</userFee>
<userFee>
<owner>
<Id>owner3</Id>
</owner>
<Amount>
<sum>180</sum>
</Amount>
</userFee>
<userFee>
<owner>
<Id>owner3</Id>
</owner>
<Amount>
<sum>100</sum>
</Amount>
</userFee>
<userFee>
<owner>
<Id>owner4</Id>
</owner>
<Amount>
<sum>75</sum>
</Amount>
</userFee>
<userFee>
<owner>
<Id>owner4</Id>
</owner>
<Amount>
<sum>25</sum>
</Amount>
</userFee>
</feeList>
</Fees>
XSLT 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:key name="user_fees" match="userFee" use="concat(../preceding-sibling::user[1]/value,'~',owner/Id)"/>
<xsl:template match="/*">
<xsl:for-each select="feeList">
<xsl:variable name="totalOwners">
<xsl:for-each select="userFee[count(.|key('user_fees',concat(../preceding-sibling::user[1]/value,'~',owner/Id))[1])=1]">
<xsl:text>#</xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:if test="position() > 1"><xsl:text>
</xsl:text></xsl:if>
<xsl:value-of select="concat('User: ',preceding-sibling::user[1]/value,'
')"/>
<xsl:value-of select="concat('Total Sum: ',sum(userFee/Amount/sum),'
')"/>
<xsl:value-of select="concat('Count: ', string-length($totalOwners), '
')"/>
<xsl:for-each
select="userFee[count(.|key('user_fees',concat(../preceding-sibling::user[1]/value,'~',owner/Id))[1])=1]">
<xsl:value-of
select="concat('	owner and amount: ',
owner/Id,
', ',
sum(key('user_fees',concat(../preceding-sibling::user[1]/value,'~',owner/Id))/Amount/sum),'
')"/>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
выход
User: userA
Total Sum: 400
Count: 3
owner and amount: owner1, 200
owner and amount: owner2, 100
owner and amount: owner3, 100
User: userB
Total Sum: 600
Count: 4
owner and amount: owner1, 120
owner and amount: owner2, 100
owner and amount: owner3, 280
owner and amount: owner4, 100
Fiddle: http://xsltfiddle.liberty -development.net / nc4NzQ8