Группировка ключей XSLT для дочерних узлов
<root>
<Entry>
<ID>1</ID>
<Details>
<Code>A1</Code>
<Value>1000</Value>
</Details>
<Details>
<Code>A2</Code>
<Value>2000</Value>
</Details>
</Entry>
<Entry>
<ID>2</ID>
<Details>
<Code>B1</Code>
<Value>1500</Value>
</Details>
<Details>
<Code>B2</Code>
<Value>2500</Value>
</Details>
<Details>
<Code>A3</Code>
<Value>3000</Value>
</Details>
</Entry>
</root>
У меня есть этот входной XML. Для каждого
<Entry>
, Я хочу сгруппировать
<Details>
узлы (которые являются дочерними узлами входа) и в конечном итоге принимают сумму
<Value>
значения узлов по следующим группам кода следующие:
- Коды A1, A2 и A3 должны быть сгруппированы вместе (скажем, "A")
- Коды B1, B2 и B3 должны быть сгруппированы вместе (скажем, "B").
[Примечание: коды приведены только для примера, а фактические коды полностью отличаются, поэтому решение для подстроки не будет работать, пожалуйста, не рассматривайте эти коды буквально]
Результат будет выглядеть так:
<Output>
<Output-Line>
<ID> 1 </ID>
<Code-group> A </Code-group>
<Sum> 3000 </Sum>
<Code-group> B </Code-group>
<Sum/>
</Output-Line>
<Output-Line>
<ID> 2 </ID>
<Code-group> A </Code-group>
<Sum> 3000 </Sum>
<Code-group> B </Code-group>
<Sum> 4000 </Sum>
</Output-Line>
</Output>
Проблема, с которой я столкнулся в настоящее время, заключается в том, что
<xsl:key>
Элемент должен быть объявлен вверху, а не на индивидуальном уровне входа в цикле for-each. Поэтому я не могу сформировать правильный ключ с параметрами соответствия и использования выражения. Любая помощь приветствуется.
Заранее спасибо!
1 ответ
Предполагая, что это всего лишь еще один вариант вашего предыдущего вопроса, все, что вам нужно сделать, это добавить еще один аргумент в
key()
вызов функции, чтобы ограничить ее текущим
Entry
:
XSLT 2.0
<xsl:stylesheet version="2.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="entry" match="Details" use="Code"/>
<xsl:template match="/root">
<Output>
<xsl:for-each select="Entry">
<Output-Line>
<xsl:copy-of select="ID"/>
<Code-group> A </Code-group>
<Sum>
<xsl:value-of select="sum(key('entry', ('A1', 'A2', 'A3'), .)/Value)" />
</Sum>
<Code-group> B </Code-group>
<Sum>
<xsl:value-of select="sum(key('entry', ('B1', 'B2', 'B3'), .)/Value)" />
</Sum>
</Output-Line>
</xsl:for-each>
</Output>
</xsl:template>
</xsl:stylesheet>