XPath XSL에서 "Group By"쿼리 수행
문제
다음 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) > 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을 지원하는 것은 아닙니다
제휴하지 않습니다 StackOverflow