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>
이 입력 XML이 있는데 XSLT를 통해 그룹화하려고 합니다 . 여기서 그룹화는 노드 값 을 하드 코딩 하여 발생 합니다 . 자세히 설명하겠습니다.
그룹화는 <Code>다음과 같이 노드에 나타나는 Code 매개 변수에 따라 발생해야 합니다.
- 코드 'A1'및 'A2'를 함께 그룹화해야합니다.
- 코드 'B1'및 'B2'를 함께 그룹화해야합니다.
결국 <Value>이 그룹 의 노드에서 나오는 값을 합산합니다 . 따라서 출력은 다음과 같습니다.
<Output>
<Code-group> A </Code-group>
<Sum> 3000 </Sum>
<Code-group> B </Code-group>
<Sum> 7000 </Sum>
</Output>
이 요구 사항을 위해서는 그룹화 값의 하드 코딩이 필요합니다 (그룹 A1, A2는 A로, B1은 B2로). 코드 (A1, A2, B1, B2)는 임의의 순서로 올 수 있으므로 노드 인덱스를 찾는 것보다 그룹화를 찾기 위해 값을 하드 코딩하고 싶기 때문에 '하드 코딩'이라는 단어를 사용하고 있습니다.
각 그룹 별 방법과 Muenchian Grouping 방법을 살펴 보았지만 위의 그룹 매핑을 달성 할 수 없었습니다. 어떤 도움을 주셔서 감사합니다!
미리 감사드립니다
편집 : 매핑 A1, A2-> A & B1, B2-> B는 일반적인 예이며 실제 노드 값은 이것과 완전히 다르므로 하위 문자열 솔루션이 작동하지 않습니다. 그래서 매핑을 달성하기 위해 하드 코딩에 집중했습니다.
답변
하드 코딩 요구 사항은 이해하기 어렵습니다. 다음과 같은 작업을 원할 수 있습니다.
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>
각 그룹에 대해 사용하는 옵션이 있다면 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>
깡깡이: http://xsltfiddle.liberty-development.net/jxNakzX
"A"-> A1, A2 및 "B"-> B1, B2 매핑을 실제로 하드 코딩하려면 그룹이 아닌 xsl : key를 사용할 수 있습니다.
<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>
깡깡이: http://xsltfiddle.liberty-development.net/jxNakzX/1