Я пытаюсь использовать вложенные для каждой группы и для каждого с current-group () для сжатия подобных данных в одну запись xml на основе двух ключей. Первый ключ - это ID, а второй - Inv_Link.
Я получаю ожидаемые результаты для внешнего цикла, но внутренний цикл, когда я использую // Запись, я получаю все ключи в каждом результате с. я получаю только первый элемент данных. Каков правильный селектор, чтобы получить все вложенные ключи в родительском ключе?
Спасибо за любую помощь!
Набор данных XML
<Data>
<Record>
<ID>01_2019</ID>
<Link>ICE2</Link>
<Component_ID>DEBT</Component_ID>
<Amt>1500</Amt>
</Record>
<Record>
<ID>01_2019</ID>
<Link>ICE1</Link>
<Component_ID>EQT</Component_ID>
<Amt>200</Amt>
</Record>
<Record>
<ID>01_2019</ID>
<Link>ICE1</Link>
<Component_ID>CASH</Component_ID>
<Amt>100</Amt>
</Record>
<Record>
<ID>01_2020</ID>
<Link>ICE3</Link>
<Component_ID>CASH</Component_ID>
<Amt>100</Amt>
</Record>
</Data>
XSLT, который я использую сейчас:
<xsl:template match="Data">
<xsl:for-each-group select="Record" group-by="ID">
<xsl:for-each select="current-group()">
<Record>
<groupkey><xsl:value-of select="current-grouping-key()"/></groupkey>
<AssetEvent>
<ID> <xsl:copy> <xsl:value-of select="ID/text()" /> </xsl:copy> </ID>
<DecompositionSequence>
<xsl:for-each-group select="Record" group-by="Link">
<groupkey><xsl:value-of select="current-grouping-key()"/></groupkey>
<xsl:for-each select="current-group()">
<Decompositions>
<Link>
<ID><xsl:copy><xsl:value-of select="Link/text()" /> </xsl:copy> <ID>
</Link>
<DecompositionDataSequence>
<DecompositionData>
<Component>
<ID> <xsl:copy> <xsl:value-of select="Component_ID/text()" /> </xsl:copy> </ID>
</Component>
<Amt> <xsl:copy> <xsl:value-of select="Amt/text()" /> </xsl:copy> </Amt>
</DecompositionData>
</DecompositionDataSequence>
</Decompositions>
</xsl:for-each>
</xsl:for-each-group>
</DecompositionSequence>
</AssetEvent>
</Record>
</xsl:for-each>
</xsl:for-each-group>
</xsl:template>
Текущие результаты, я получаю всего 2 записи, но без внутренней группировки (если я использую // Запись, я получаю все для обеих записей результатов):
<Record>
<groupkey>ICE 01_2019</groupkey>
<AssetEvent>
<ID>ICE 01_2019</ID>
<DecompositionSequence />
</AssetEvent>
</Record>
<Record>
<groupkey>01_2020</groupkey>
<AssetEvent>
<ID>01_2020</ID>
<DecompositionSequence />
</AssetEvent>
</Record>
Чего я жду:
<Record>
<groupkey>01_2019</groupkey>
<AssetEvent>
<ID>01_2019</ID>
<DecompositionSequence>
<groupkey>ICE2</groupkey>
<Decompositions>
<InvestmentLink>ICE2</InvestmentLink>
<DecompositionDataSequence>
<DecompositionData>
<Component>
<ID>DEBT</ID>
</Component>
<Amt>150</Amt>
</DecompositionData>
</DecompositionDataSequence>
</Decompositions>
<groupkey>ICE1</groupkey>
<Decompositions>
<InvestmentLink>ICE1</InvestmentLink>
<DecompositionDataSequence>
<DecompositionData>
<Component>
<ID>EQT</ID>
</Component>
<Amt>150</Amt>
</DecompositionData>
<DecompositionData>
<Component>
<ID>CASH</ID>
</Component>
<Amt>150</Amt>
</DecompositionData>
</DecompositionDataSequence>
</Decompositions>
</DecompositionSequence>
</AssetEvent>
</Record>
<Record>
<groupkey>01_2020</groupkey>
<AssetEvent>
<ID>01_2020</ID>
<DecompositionSequence>
<groupkey>ICE3</groupkey>
<Decompositions>
<InvestmentLink>ICE3</InvestmentLink>
<DecompositionDataSequence>
<DecompositionData>
<Component>
<ID>CASH</ID>
</Component>
<Amt>100</Amt>
</DecompositionData>
</DecompositionDataSequence>
</Decompositions>
</DecompositionSequence>
</AssetEvent>
</Record>
for-each-group
с напрямую вложеннымfor-each
поверхcurrent-group()
, так вы будете отображать, например, четыре входаRecord
с одним и тем же ключом к четырем выходнымRecord
. Поэтому обычно внутри<xsl:for-each-group select="Record" group-by="...">
вы используете<xsl:copy>...</xsl:copy>
для слияния, например. четыре вводаRecord
с одним и тем же ключом группировки для одного результатаRecord
. - person Martin Honnen   schedule 15.07.2019//
внутри любого вложенногоfor-each-group
илиfor-each
, также выглядит неправильно, поскольку выполняется поиск по всему документу. - person Martin Honnen   schedule 15.07.2019xsl:for-each-group select="."
кажется бессмысленным, поскольку отдельный элемент, сгруппированный по любому ключу, ничего не дает. - person Martin Honnen   schedule 15.07.2019<xsl:for-each-group select="Record" group-by="some-key"><xsl:copy>...<xsl:for-each-group select="current-group()" group-by="some-other-key"><!-- sequence constructor for the inner group --></xsl:for-each-group></xsl:copy></xsl:for-each-group>
. Из вашего вопроса неясно, какие ключи группировки вы хотите (текст говоритRecord/ID
, код имеетconcat(ID,'|',Description)
, выходной образец имеет значениеICE 01_2019|1/1/2019|Jan Report 2019|4
, которое, похоже, содержит еще некоторые другие данные), ни какую структуру вы хотите. - person Martin Honnen   schedule 15.07.2019Inv_Link
, но в отредактированном примере только первыйRecord
имеет такойInv_Link
дочерний элемент, а другиеRecord
имеютLink
дочерних элементов; Я до сих пор не могу понять, какая у вас структура ввода и как вы хотите сгруппировать / сопоставить ее с каким результатом. - person Martin Honnen   schedule 15.07.2019