문제

다음 XML이 주어지면 :

<results name="queryResults">
  <int name="intfield1:[* TO 10]">11</int> 
  <int name="intfield2:[10 TO 20]">9</int> 
  <int name="intfield1:[10 TO 20]">12</int> 
</results>

이 XML을 생산하고 싶습니다 :

<results>
    <field name="numberfield1">
        <value name="[* TO 10]">11</value>
        <value name="[10 TO 10]">12</value>
    </field>
    <field name="numberfield2">
        <value name="[10 TO 20]">9</value>
    </field>
</results>

숫자로 그룹화하고 싶기 때문에 주로 XSL 에서이 작업을 수행하는 방법을 생각할 수 없습니다.

<xsl:if test="count(results/int) &gt; 0">
    <results>
    <xsl:for-each select="results/int">
        <field>
            <xsl:attribute name="name">
                <xsl:value-of select="substring-before(@name, ':')"/></xsl:attribute>
            <value>
                <xsl:attribute name="name">
                    <xsl:value-of select="substring-after(@name, ':') "/>
                </xsl:attribute>
                <xsl:value-of select="."/>
            </value>
        </field>
    </xsl:for-each>
    </results>
</xsl:if>

그러나 이것은 대신 멋진 그룹화 된 목록을 생성하지 않습니다.

<results>
    <field name="numberfield1">
        <value name="[* TO 10]">11</value>
    </field>
    <field name="numberfield2">
        <value name="[10 TO 20]">9</value>
    </field>
    <field name="numberfield1">
        <value name="[10 TO 10]">12</value>
    </field>
</results>

누군가가 올바른 방향으로 나를 막을 수 있다면 .. 그게 좋을까요?

감사

도움이 되었습니까?

해결책

XSLT 1.0 에서이 작업을 수행하려면 "무처리 그룹 그룹". 먼저 그룹화하려는 노드 키를 만듭니다.

<xsl:key name="intfield" match="int" use="substring-before(@name, ':')" />

다음으로 모든 노드를 통해 반복하지만 관련 그룹에서 처음으로 발생하는 노드 만 선택합니다.

<xsl:for-each select="int[generate-id() = generate-id(key('intfield', substring-before(@name, ':'))[1])]">

다음으로 키를 사용하여 그룹의 모든 노드를 반복 할 수 있습니다.

<xsl:variable name="intfieldname" select="substring-before(@name, ':')"/>
<xsl:for-each select="key('intfield', $intfieldname)">

이것을 모두 모으는 것은 제공합니다

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:output method="xml"/>
   <xsl:key name="intfield" match="int" use="substring-before(@name, ':')"/>
   <xsl:template match="/results">
      <results>
         <xsl:for-each select="int[generate-id() = generate-id(key('intfield', substring-before(@name, ':'))[1])]">
            <xsl:variable name="intfieldname" select="substring-before(@name, ':')"/>
            <field>
               <xsl:attribute name="name">
                  <xsl:value-of select="$intfieldname"/>
               </xsl:attribute>
               <xsl:for-each select="key('intfield', $intfieldname)">
                  <value>
                     <xsl:attribute name="name">
                        <xsl:value-of select="substring-after(@name, ':')"/>
                     </xsl:attribute>
                     <xsl:value-of select="."/>
                  </value>
               </xsl:for-each>
            </field>
         </xsl:for-each>
      </results>
   </xsl:template>
</xsl:stylesheet>

예에서 'intfield'는 '숫자 필드'가됩니다. 위의 예에서 이름을 'intfield'로 유지했습니다.

  • 고정 오타.

다른 팁

Muenchian 그룹화는 천재의 작품입니다. 이해하기 쉽지는 않지만 다음을 참조하십시오.http://www.jenitennison.com/xslt/grouping/muenchian.html

프로세스를 단순화하기 위해 W3C는 XSLT2.0에서 구체적으로 지원되는 그룹화. 예를 들면 다음과 같습니다.http://www.xml.com/pub/a/a/a/a/a/05/tr.html

그러나 모든 환경이 XSLT2.0을 지원하는 것은 아닙니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top