私はこの入力を得ました
<?xml version="1.0" encoding="UTF-8"?>
<result>
<datapoint poiid="2492" period="2004" value="1240"/>
<datapoint poiid="2492" period="2005" value="1290"/>
<datapoint poiid="2492" period="2006" value="1280"/>
<datapoint poiid="2492" period="2007" value="1320"/>
<datapoint poiid="2492" period="2008" value="1330"/>
<datapoint poiid="2492" period="2009" value="1340"/>
<datapoint poiid="2492" period="2010" value="1340"/>
<datapoint poiid="2492" period="2011" value="1335"/>
<datapoint poiid="2493" period="2004" value="1120"/>
<datapoint poiid="2493" period="2005" value="1120"/>
<datapoint poiid="2493" period="2006" value="1100"/>
<datapoint poiid="2493" period="2007" value="1100"/>
<datapoint poiid="2493" period="2008" value="1100"/>
<datapoint poiid="2493" period="2009" value="1110"/>
<datapoint poiid="2493" period="2010" value="1105"/>
<datapoint poiid="2493" period="2011" value="1105"/>
</result>
そして私はこのxslt 2.0を使用します
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="result">
<xsl:for-each-group select="datapoint" group-by="@poiid">
<node type="poiid" id="{@poiid}">
<xsl:for-each select="current-group()">
<node type="period" id="{@period}" value="{@value}"/>
</xsl:for-each>
</node>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
に変換します
<?xml version="1.0" encoding="UTF-8"?>
<node type="poiid" id="2492">
<node type="period" id="2004" value="1240"/>
<node type="period" id="2005" value="1290"/>
<node type="period" id="2006" value="1280"/>
<node type="period" id="2007" value="1320"/>
<node type="period" id="2008" value="1330"/>
<node type="period" id="2009" value="1340"/>
<node type="period" id="2010" value="1340"/>
<node type="period" id="2011" value="1335"/>
</node>
<node type="poiid" id="2493">
<node type="period" id="2004" value="1120"/>
<node type="period" id="2005" value="1120"/>
<node type="period" id="2006" value="1100"/>
<node type="period" id="2007" value="1100"/>
<node type="period" id="2008" value="1100"/>
<node type="period" id="2009" value="1110"/>
<node type="period" id="2010" value="1105"/>
<node type="period" id="2011" value="1105"/>
</node>
スムーズに動作します。
私が行き詰まったのは、よりダイナミックにしようとしたときです。実際の入力には、データポイントごとに 3 つではなく 6 つの属性があり、ユースケースでは、グループ化パラメーターを動的に設定する可能性が必要です。
パラメータを使ってみた
<xsl:param name="k1" select="'poiid'"/>
<xsl:param name="k2" select="'period'"/>
しかし、それらをxsltの残りの部分に渡すことは、私が正しく理解できないものです。以下のコードは機能しませんが、私が探しているものを明確にすることを願っています。
<xsl:template match="result">
<xsl:for-each-group select="datapoint" group-by="@{$k1}">
<node type="{$k1}" id="@{$k1}">
<xsl:for-each select="current-group()">
<node type="{$k2}" id="@{$k2}" value="{@value}"/>
</xsl:for-each>
</node>
</xsl:for-each-group>
</xsl:template>
どんな助けでも感謝..