Pengelompokan Node dengan nilai node hardcoding di XSLT
<root>
<Entry>
<ID>1</ID>
<Details>
<Code>A1</Code>
<Value>1000</Value>
</Details>
</Entry>
<Entry>
<ID>2</ID>
<Details>
<Code>A2</Code>
<Value>2000</Value>
</Details>
</Entry>
<Entry>
<ID>3</ID>
<Details>
<Code>B1</Code>
<Value>3000</Value>
</Details>
</Entry>
<Entry>
<ID>4</ID>
<Details>
<Code>B2</Code>
<Value>4000</Value>
</Details>
</Entry>
</root>
Saya memiliki input XML yang saya cari untuk dikelompokkan melalui XSLT di mana pengelompokan terjadi dengan nilai node hardcoding . Izinkan saya menjelaskannya secara rinci:
Pengelompokan perlu dilakukan berdasarkan parameter Kode yang muncul di node <Code>sebagai berikut:
- Kode 'A1' dan 'A2' perlu dikelompokkan bersama
- Kode 'B1' dan 'B2' perlu dikelompokkan bersama
Saya akhirnya menjumlahkan nilai yang keluar dari <Value>node dalam grup ini. Jadi Outputnya adalah sebagai berikut:
<Output>
<Code-group> A </Code-group>
<Sum> 3000 </Sum>
<Code-group> B </Code-group>
<Sum> 7000 </Sum>
</Output>
Untuk persyaratan ini, perlu ada pengkodean keras nilai pengelompokan (ke grup A1, A2 sebagai A dan B1, B2 sebagai B). Saya menggunakan kata 'hardcoded' karena Kode (A1, A2, B1, B2) dapat datang dalam urutan apa pun jadi saya ingin membuat kode keras untuk mencari pengelompokan daripada mencari indeks Node.
Saya melihat metode untuk setiap grup serta metode Pengelompokan Muenchian tetapi tidak dapat mencapai pemetaan grup di atas. Setiap bantuan dihargai!
Terima kasih sebelumnya
EDIT: Pemetaan A1, A2 -> A & B1, B2 -> B adalah contoh umum, nilai node yang sebenarnya sama sekali berbeda dari ini, jadi solusi substring tidak akan berfungsi. Itulah mengapa saya berfokus pada pengkodean keras untuk mencapai pemetaan itu.
Jawaban
Persyaratan hardcoding sulit untuk dipahami. Mungkin Anda ingin melakukan sesuatu seperti:
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="Entry" use="Details/Code"/>
<xsl:template match="/root">
<Output>
<Code-group> A </Code-group>
<Sum>
<xsl:value-of select="sum(key('entry', ('A1', 'A2'))/Details/Value)" />
</Sum>
<Code-group> B </Code-group>
<Sum>
<xsl:value-of select="sum(key('entry', ('B1', 'B2'))/Details/Value)" />
</Sum>
</Output>
</xsl:template>
</xsl:stylesheet>
Jika Anda memiliki opsi untuk menggunakan untuk setiap grup, saya pasti akan menggunakannya selama pengelompokan Muenchian ...
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<Output>
<xsl:for-each-group select="Entry" group-by="substring(Details/Code,1,1)">
<Code-group>
<xsl:value-of select="current-grouping-key()"/>
</Code-group>
<Sum>
<xsl:value-of select="sum(current-group()/Details/Value)"/>
</Sum>
</xsl:for-each-group>
</Output>
</xsl:template>
</xsl:stylesheet>
Biola: http://xsltfiddle.liberty-development.net/jxNakzX
Jika Anda benar-benar ingin membuat kode keras pemetaan "A" -> A1, A2 dan "B" -> B1, B2, Anda dapat menggunakan xsl: key dan bukan grup sama sekali ...
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="A" match="Entry[Details/Code=('A1','A2')]" use="'A'"/>
<xsl:key name="B" match="Entry[Details/Code=('B1','B2')]" use="'B'"/>
<xsl:template match="/*">
<xsl:variable name="ctx" select="."/>
<Output>
<xsl:for-each select="('A','B')">
<xsl:variable name="key" select="."/>
<Code-group>
<xsl:value-of select="$key"/> </Code-group> <Sum> <xsl:value-of select="sum($ctx/key($key,$key)/Details/Value)"/>
</Sum>
</xsl:for-each>
</Output>
</xsl:template>
</xsl:stylesheet>
Biola: http://xsltfiddle.liberty-development.net/jxNakzX/1