1

最近XSLTを使用していますが、新しいxmlファイルをグループ化しようとすると新しい問題が発生します。グループ化にスコープを設定する方法がわかりません。すべてのノードの<Detail>内部をグループ化したい。<Info>簡単なサンプルファイル:

<?xml version="1.0" encoding="utf-8"?>
<File>
  <Info>
    <Id>1111</Id>
  <Detail type="A" group="1" >
    <Data>
      <Nr>1</Nr>
    </Data>
    <Data>
      <Nr>2</Nr>
    </Data>
  </Detail>
  <Detail type="B" group="1">
    <Data>
      <Nr>3</Nr>
    </Data>
    <Data>
      <Nr>4</Nr>
    </Data>
  </Detail>
  <Detail type="B" group="2">
    <Data>
      <Nr>5</Nr>
    </Data>
  </Detail>
  <Detail type="A" group="1">
    <Data>
      <Nr>6</Nr>
    </Data>
  </Detail>
 </Info>
 <Info>
   <Id>2222</Id>
    <Detail type="A" group="1" >
      <Data>
        <Nr>1</Nr>
      </Data>
    </Detail>
    <Detail type="B" group="1">
      <Data>
        <Nr>2</Nr>
      </Data>
    </Detail>
    <Detail type="A" group="1">
      <Data>
        <Nr>3</Nr>
      </Data>
    </Detail>
  </Info>
</File>

出力は次のようになります

<?xml version="1.0" encoding="utf-8"?>
<File>
  <Info>
    <Id>1111</Id>
  <Detail type="A" group="1" >
    <Data>
      <Nr>1</Nr>
    </Data>
    <Data>
      <Nr>2</Nr>
    </Data>
      <Data>
      <Nr>6</Nr>
    </Data>
  </Detail>
  <Detail type="B" group="1">
    <Data>
      <Nr>3</Nr>
    </Data>
    <Data>
      <Nr>4</Nr>
    </Data>
  </Detail>
  <Detail type="B" group="2">
    <Data>
      <Nr>5</Nr>
    </Data>
  </Detail>
 </Info>
 <Info>
   <Id>2222</Id>
    <Detail type="A" group="1" >
      <Data>
        <Nr>1</Nr>
      </Data>
          <Data>
        <Nr>3</Nr>
      </Data>
    </Detail>
    <Detail type="B" group="1">
      <Data>
        <Nr>2</Nr>
      </Data>
    </Detail>
  </Info>
</File>

私の試みでは、要素から値をコピーする方法がわかりません<Info>(ID、他の要素でもかまいません)。要素を書き出すだけ<Info>で、すべて<Detail>が最初の<Info>要素にグループ化され、最後の<Info>要素は空のままになります。

これが私のxsltです

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:key name="details" match="Detail"
          use="concat(@type,'_',@group)"/>
  <xsl:template match='/'>
    <File>
      <xsl:for-each select="File/Info">
        <Info>
        <xsl:for-each select="Detail[count(. | key('details', concat(@type,'_',@group))[1]) = 1]">
        <xsl:sort select="concat(@type,'_',@group)" />
        <Detail type="{@type}" group="{@group}">
          <xsl:for-each select="key('details', concat(@type,'_',@group))">
            <xsl:copy-of select="Data"/>
          </xsl:for-each>
        </Detail>
        </xsl:for-each>
        </Info>
      </xsl:for-each>
    </File>
  </xsl:template>
</xsl:stylesheet>

これが私のこれまでの結果です

<File>
  <Info>
    <Detail type="A" group="1">
      <Data>
        <Nr>1</Nr>
      </Data>
      <Data>
        <Nr>2</Nr>
      </Data>
      <Data>
        <Nr>6</Nr>
      </Data>
      <Data>
        <Nr>1</Nr>
      </Data>
      <Data>
        <Nr>3</Nr>
      </Data>
    </Detail>
    <Detail type="B" group="1">
      <Data>
        <Nr>3</Nr>
      </Data>
      <Data>
        <Nr>4</Nr>
      </Data>
      <Data>
        <Nr>2</Nr>
      </Data>
    </Detail>
    <Detail type="B" group="2">
      <Data>
        <Nr>5</Nr>
      </Data>
    </Detail>
  </Info>
  <Info />
</File>

助けてくれてありがとう:)

4

1 に答える 1

0

この変換

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kDetailChildren" match="Detail"
  use="concat(generate-id(..),'+',@type,'+',@group)"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match=
 "Detail
   [not(generate-id()
       =
        generate-id(key('kDetailChildren',
                        concat(generate-id(..),'+',@type,'+',@group)
                        )[1])
        )]"/>
 <xsl:template match="Detail">
  <Detail>
    <xsl:apply-templates select="@*"/>
    <xsl:apply-templates select=
    "key('kDetailChildren',
         concat(generate-id(..),'+',@type,'+',@group)
         )/node()"/>
  </Detail>
 </xsl:template>
</xsl:stylesheet>

提供されたXMLドキュメントに適用する場合:

<File>
    <Info>
        <Id>1111</Id>
        <Detail type="A" group="1" >
            <Data>
                <Nr>1</Nr>
            </Data>
            <Data>
                <Nr>2</Nr>
            </Data>
        </Detail>
        <Detail type="B" group="1">
            <Data>
                <Nr>3</Nr>
            </Data>
            <Data>
                <Nr>4</Nr>
            </Data>
        </Detail>
        <Detail type="B" group="2">
            <Data>
                <Nr>5</Nr>
            </Data>
        </Detail>
        <Detail type="A" group="1">
            <Data>
                <Nr>6</Nr>
            </Data>
        </Detail>
    </Info>
    <Info>
        <Id>2222</Id>
        <Detail type="A" group="1" >
            <Data>
                <Nr>1</Nr>
            </Data>
        </Detail>
        <Detail type="B" group="1">
            <Data>
                <Nr>2</Nr>
            </Data>
        </Detail>
        <Detail type="A" group="1">
            <Data>
                <Nr>3</Nr>
            </Data>
        </Detail>
    </Info>
</File>

必要な正しい結果を生成します。

<File>
   <Info>
      <Id>1111</Id>
      <Detail type="A" group="1">
         <Data>
            <Nr>1</Nr>
         </Data>
         <Data>
            <Nr>2</Nr>
         </Data>
         <Data>
            <Nr>6</Nr>
         </Data>
      </Detail>
      <Detail type="B" group="1">
         <Data>
            <Nr>3</Nr>
         </Data>
         <Data>
            <Nr>4</Nr>
         </Data>
      </Detail>
      <Detail type="B" group="2">
         <Data>
            <Nr>5</Nr>
         </Data>
      </Detail>
   </Info>
   <Info>
      <Id>2222</Id>
      <Detail type="A" group="1">
         <Data>
            <Nr>1</Nr>
         </Data>
         <Data>
            <Nr>3</Nr>
         </Data>
      </Detail>
      <Detail type="B" group="1">
         <Data>
            <Nr>2</Nr>
         </Data>
      </Detail>
   </Info>
</File>

説明

  1. 複合キーを使用したIDルールMuenchianグループ化方法の適切な使用。

  2. 親のIDがキーにどのように含まれているかに注意してください。

于 2012-10-01T13:39:25.133 に答える