1

私はこの入力を得ました

<?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>

どんな助けでも感謝..

4

1 に答える 1

1

方法は次のとおりです。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

 <xsl:param name="k1" select="'poiid'"/>
 <xsl:param name="k2" select="'period'"/>

 <xsl:template match="result">
   <xsl:for-each-group select="datapoint" group-by="@*[name()= $k1]">
     <node type="{$k1}" id="{@*[name() = $k1]}">
       <xsl:for-each select="current-group()">
         <node type="{k2}" id="{@*[name()= $k2]}" value="{@value}"/>
       </xsl:for-each>
     </node>
   </xsl:for-each-group>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<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>

必要な正しい結果が生成されます。

<node type="poiid" id="2492">
   <node type="" id="2004" value="1240"/>
   <node type="" id="2005" value="1290"/>
   <node type="" id="2006" value="1280"/>
   <node type="" id="2007" value="1320"/>
   <node type="" id="2008" value="1330"/>
   <node type="" id="2009" value="1340"/>
   <node type="" id="2010" value="1340"/>
   <node type="" id="2011" value="1335"/>
</node>
<node type="poiid" id="2493">
   <node type="" id="2004" value="1120"/>
   <node type="" id="2005" value="1120"/>
   <node type="" id="2006" value="1100"/>
   <node type="" id="2007" value="1100"/>
   <node type="" id="2008" value="1100"/>
   <node type="" id="2009" value="1110"/>
   <node type="" id="2010" value="1105"/>
   <node type="" id="2011" value="1105"/>
</node>
于 2012-12-02T23:01:49.803 に答える