2

XSLTを使用したグループ化に問題があります。これが私の例です: これは入力ファイルです:

 <HeadNr>
  <nummerK>989</nummerK>
  </HeadNr>

     <Qua>
      <Abrufd>921</Abrufd>
      <Abrufm>20</Abrufm>
      <Summe>103,1</Summe>
      <Einzel>42,1</Einzel>
    </Qua>

    <HeadNr>
  <nummerK>911</nummerK>
  </HeadNr>

     <Qua>
      <Abrufd>321</Abrufd>
      <Abrufm>40</Abrufm>
      <Summe>143,1</Summe>
      <Einzel>222,1</Einzel>
    </Qua>

    <HeadNr>
  <nummerK>989</nummerK>
  </HeadNr>

     <Qua>
      <Abrufd>922</Abrufd>
      <Abrufm>204</Abrufm>
      <Summe>1033,1</Summe>
      <Einzel>4222,1</Einzel>
    </Qua>

これは出力ファイルです:

<root>
<HeadNr>
  <nummerK>989</nummerK>
  </HeadNr>

     <Qua>
      <Abrufd>921</Abrufd>
      <Abrufm>20</Abrufm>
      <Summe>103,1</Summe>
      <Einzel>42,1</Einzel>
    </Qua>
 </root>
 <root>   
    <HeadNr>
  <nummerK>911</nummerK>
  </HeadNr>

     <Qua>
      <Abrufd>321</Abrufd>
      <Abrufm>40</Abrufm>
      <Summe>143,1</Summe>
      <Einzel>222,1</Einzel>
    </Qua>
 </root>
 <root>   
    <HeadNr>
  <nummerK>989</nummerK>
  </HeadNr>

     <Qua>
      <Abrufd>922</Abrufd>
      <Abrufm>204</Abrufm>
      <Summe>1033,1</Summe>
      <Einzel>4222,1</Einzel>
    </Qua>
</root>

タグとその間のすべてをタグに入れる必要があります。私の英語をありがとう、そしてごめんなさい。

4

2 に答える 2

1

この変換

<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:template match="node()|@*" name="identity">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="HeadNr">
  <root>
   <HeadNr>
     <xsl:apply-templates/>
   </HeadNr>
   <xsl:apply-templates select="following-sibling::Qua[1]" mode="inGroup"/>
  </root>
 </xsl:template>

 <xsl:template match="Qua" mode="inGroup"><xsl:call-template name="identity"/></xsl:template>
 <xsl:template match="Qua"/>
</xsl:stylesheet>

このXMLドキュメント(単一の最上位要素にラップされた提供されたフラグメント)に適用された場合:

<t>
    <HeadNr>
        <nummerK>989</nummerK>
    </HeadNr>
    <Qua>
        <Abrufd>921</Abrufd>
        <Abrufm>20</Abrufm>
        <Summe>103,1</Summe>
        <Einzel>42,1</Einzel>
    </Qua>
    <HeadNr>
        <nummerK>911</nummerK>
    </HeadNr>
    <Qua>
        <Abrufd>321</Abrufd>
        <Abrufm>40</Abrufm>
        <Summe>143,1</Summe>
        <Einzel>222,1</Einzel>
    </Qua>
    <HeadNr>
        <nummerK>989</nummerK>
    </HeadNr>
    <Qua>
        <Abrufd>922</Abrufd>
        <Abrufm>204</Abrufm>
        <Summe>1033,1</Summe>
        <Einzel>4222,1</Einzel>
    </Qua>
</t>

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

<t>
   <root>
      <HeadNr>
         <nummerK>989</nummerK>
      </HeadNr>
      <Qua>
         <Abrufd>921</Abrufd>
         <Abrufm>20</Abrufm>
         <Summe>103,1</Summe>
         <Einzel>42,1</Einzel>
      </Qua>
   </root>
   <root>
      <HeadNr>
         <nummerK>911</nummerK>
      </HeadNr>
      <Qua>
         <Abrufd>321</Abrufd>
         <Abrufm>40</Abrufm>
         <Summe>143,1</Summe>
         <Einzel>222,1</Einzel>
      </Qua>
   </root>
   <root>
      <HeadNr>
         <nummerK>989</nummerK>
      </HeadNr>
      <Qua>
         <Abrufd>922</Abrufd>
         <Abrufm>204</Abrufm>
         <Summe>1033,1</Summe>
         <Einzel>4222,1</Einzel>
      </Qua>
   </root>
</t>

注意してください

この変換は、単にを使用するソリューションよりも長く見え<xsl:copy-of>ます。ただし、柔軟性と拡張性が高いため、グループ内の要素に一致する追加のテンプレートを定義できます。

于 2012-09-20T12:12:34.620 に答える
1

HeadNr要素を最初の次のQua兄弟で「グループ化」しようとしているようです。

入力XMLにXMLへのルート要素があると仮定すると、 HeadNr要素を選択することから始めます。

<xsl:apply-templates select="HeadNr" />

次に、これらに一致するテンプレートが作成されます。ルート要素を作成し、現在の要素と次のQua要素をコピーします。

これが完全なXSLTです

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

   <xsl:template match="/*">
      <xsl:apply-templates select="HeadNr" />
   </xsl:template>

   <xsl:template match="HeadNr">
      <root>
         <xsl:copy-of select="." />
         <xsl:copy-of select="following-sibling::Qua[1]" />
      </root>
   </xsl:template>
</xsl:stylesheet>

XMLに適用すると(ルート要素が指定された場合)、次のように出力されます

<root>
    <HeadNr>
        <nummerK>989</nummerK>
    </HeadNr>
    <Qua>
        <Abrufd>921</Abrufd>
        <Abrufm>20</Abrufm>
        <Summe>103,1</Summe>
        <Einzel>42,1</Einzel>
    </Qua>
</root>
<root>
    <HeadNr>
        <nummerK>911</nummerK>
    </HeadNr>
    <Qua>
        <Abrufd>321</Abrufd>
        <Abrufm>40</Abrufm>
        <Summe>143,1</Summe>
        <Einzel>222,1</Einzel>
    </Qua>
</root>
<root>
    <HeadNr>
        <nummerK>989</nummerK>
    </HeadNr>
    <Qua>
        <Abrufd>922</Abrufd>
        <Abrufm>204</Abrufm>
        <Summe>1033,1</Summe>
        <Einzel>4222,1</Einzel>
    </Qua>
</root>
于 2012-09-20T12:03:48.823 に答える