0

これは私の入力xmlファイルです

<Collection>
<Teach>
<DeptNo>5613</DeptNo>
<DeptName>Computers</DeptName>
<SubjectNo>234</SubjectNo>
<SubjectName>XML</SubjectName>
<Teacher>Sai</Teacher>
</Teach>
<Teach>
<DeptNo>5617</DeptNo>
<DeptName>Electronics</DeptName>
<SubjectNo>789</SubjectNo>
<SubjectName>Circuits</SubjectName>
<Teacher>Hari</Teacher>
</Teach>
<Teach>
<DeptNo>5613</DeptNo>
<DeptName>Computers</DeptName>
<SubjectNo>239</SubjectNo>
<SubjectName>XSLT</SubjectName>
<Teacher>Suri</Teacher>
</Teach>
<Teach>
<DeptNo>5689</DeptNo>
<DeptName>Maths</DeptName>
<SubjectNo>749</SubjectNo>
<SubjectName>Trigonometry</SubjectName>
<Teacher>Arya</Teacher>
</Teach>
<Teach>
<DeptNo>5617</DeptNo>
<DeptName>Electronics</DeptName>
<SubjectNo>789</SubjectNo>
<SubjectName>Circuits</SubjectName>
<Teacher>Bharat</Teacher>
</Teach>
</Collection>

次に、DeptNo に基づいて次の出力 xml ファイルが必要です。同じ場合は Subjectno を確認し、同じ場合は教師を件名に追加します。Subject と Dept についても同じことを行います。出力ファイルは次のようになります。

<Collection>
<DeptList>
<DeptNo>5613</DeptNo>
<DeptName>Computers</DeptName>
<SubjectList>
<SubjectNo>234</SubjectNo>
<SubjectName>XML</SubjectName>
<TeacherList>
<Teacher>Sai</Teacher>
</TeacherList>
</SubjectList>
<SubjectList>
<SubjectNo>239</SubjectNo>
<SubjectName>XSLT</SubjectName>
<TeacherList>
<Teacher>Suri</Teacher>
</TeacherList>
</SubjectList>
</DeptList>
<DeptList>
<DeptNo>5617</DeptNo>
<DeptName>Electronics</DeptName>
<SubjectList>
<SubjectNo>789</SubjectNo>
<SubjectName>Circuits</SubjectName>
<TeacherList>
<Teacher>Hari</Teacher>
<Teacher>Bharat</Teacher>
</TeacherList>
</SubjectList> 
</DeptList>
<DeptList>
<DeptNo>5689</DeptNo>
<DeptName>Maths</DeptName>
<SubjectList>
<SubjectNo>749</SubjectNo>
<SubjectName>Trigonometry</SubjectName>
<TeacherList>
<Teacher>Arya</Teacher>
</TeacherList>
</SubjectList>
</DeptList>
</Collection>
4

1 に答える 1

2

以下は、Saxon 9、AltovaXML、XmlPrime、またはその他の XSLT 2.0 プロセッサで実行される XSLT 2.0 スタイルシートです。

<xsl:stylesheet version="2.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output indent="yes"/>

<xsl:template match="Collection">
  <xsl:copy>
    <xsl:for-each-group select="Teach" group-by="DeptNo">
      <DeptList>
        <xsl:copy-of select="DeptNo, DeptName"/>
        <xsl:for-each-group select="current-group()" group-by="SubjectNo">
          <SubjectList>
            <xsl:copy-of select="SubjectNo, SubjectName"/>
            <TeacherList>
              <xsl:copy-of select="current-group()/Teacher"/>
            </TeacherList>
          </SubjectList>
        </xsl:for-each-group>
      </DeptList>
    </xsl:for-each-group>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

[編集] XSLT 1.0 ソリューションが必要な場合は、Muechian グループ化を使用できます。

<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output indent="yes"/>

<xsl:key name="deptNo" match="Teach" use="DeptNo"/>
<xsl:key name="deptAndSubject" match="Teach" use="concat(DeptNo, '|', SubjectNo)"/>

<xsl:template match="Collection">
  <xsl:copy>
    <!-- <xsl:for-each-group select="Teach" group-by="DeptNo"> -->
    <xsl:for-each select="Teach[generate-id() = generate-id(key('deptNo', DeptNo)[1])]">
      <DeptList>
        <xsl:copy-of select="DeptNo | DeptName"/>
        <!--  <xsl:for-each-group select="current-group()" group-by="SubjectNo"> -->
        <xsl:for-each select="key('deptNo', DeptNo)[generate-id() = generate-id(key('deptAndSubject', concat(DeptNo, '|', SubjectNo))[1])]">
          <SubjectList>
            <xsl:copy-of select="SubjectNo | SubjectName"/>
            <TeacherList>
              <xsl:copy-of select="key('deptAndSubject', concat(DeptNo, '|', SubjectNo))/Teacher"/>
            </TeacherList>
          </SubjectList>
        </xsl:for-each>
      </DeptList>
    </xsl:for-each>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

XSLT 2.0 命令を意図的にコメントアウトしてfor-each-group、同等の XSLT 1.0 キー ベースの Muenchian グループ化構造を示しました。

于 2013-01-07T13:04:42.550 に答える