XSLT에서 노드 값을 하드 코딩하여 노드 그룹화

Oct 12 2020
<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 매개 변수에 따라 발생해야 합니다.

  1. 코드 'A1'및 'A2'를 함께 그룹화해야합니다.
  2. 코드 '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는 일반적인 예이며 실제 노드 값은 이것과 완전히 다르므로 하위 문자열 솔루션이 작동하지 않습니다. 그래서 매핑을 달성하기 위해 하드 코딩에 집중했습니다.

답변

2 michael.hor257k Oct 12 2020 at 17:37

하드 코딩 요구 사항은 이해하기 어렵습니다. 다음과 같은 작업을 원할 수 있습니다.

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>
1 DanielHaley Oct 12 2020 at 16:59

각 그룹에 대해 사용하는 옵션이 있다면 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