0

以下のxmlがあると仮定しましょう。目標は、FirstName でグループ化し、Person を別の xml ファイルにエクスポートすることです。各出力 xml ファイルには、最大 X 個の異なるFirstNameのみを含める必要があります。

以下は、X = 3 での目的の変換の例です。

XML 入力:

<People>
    <Person>             
        <FirstName>John</FirstName>             
        <LastName>Doe</LastName> 
    </Person> 
    <Person>             
        <FirstName>Jack</FirstName>             
        <LastName>White</LastName> 
    </Person>
    <Person>             
        <FirstName>Mark</FirstName>             
        <LastName>Wall</LastName> 
    </Person>
    <Person>             
        <FirstName>John</FirstName>             
        <LastName>Ding</LastName> 
    </Person> 
    <Person>             
        <FirstName>Cyrus</FirstName>             
        <LastName>Ding</LastName> 
    </Person>  
    <Person>             
        <FirstName>Megan</FirstName>             
        <LastName>Boing</LastName> 
    </Person>
</People>          

3 つの異なる FirstName を持つ XML 出力 1

<People>
    <Person>             
        <FirstName>John</FirstName>             
        <LastName>Doe</LastName> 
    </Person> 
    <Person>             
        <FirstName>John</FirstName>             
        <LastName>Ding</LastName> 
    </Person>
    <Person>             
        <FirstName>Jack</FirstName>             
        <LastName>White</LastName> 
    </Person>
    <Person>             
        <FirstName>Mark</FirstName>             
        <LastName>Wall</LastName> 
    </Person>  
</People> 

FirstName が 2 つ残っている XML 出力 2

<People>
    <Person>             
        <FirstName>Cyrus</FirstName>             
        <LastName>Ding</LastName> 
    </Person>  
    <Person>             
        <FirstName>Megan</FirstName>             
        <LastName>Boing</LastName> 
    </Person>
</People> 

Muenchian のグループ化を と一緒に使用して、複数の出力ファイルを生成できるように思えます。ただし、中心的な問題は、新しいファイルにエクスポートする前に、人数のしきい値をどこに設定できるかということです。

4

1 に答える 1

1

XSLT 2.0 を使用して 2 つのステップで実行する例を次に示します。

<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:param name="n" as="xs:integer" select="3"/>

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="People">
    <xsl:variable name="groups" as="element(group)*">
      <xsl:for-each-group select="Person" group-by="FirstName">
        <group>
          <xsl:copy-of select="current-group()"/>
        </group>
      </xsl:for-each-group>
    </xsl:variable>
    <xsl:for-each-group select="$groups" group-by="(position() - 1) idiv $n">
      <xsl:result-document href="group{position()}.xml">
        <People>
          <xsl:copy-of select="current-group()"/>
        </People>
      </xsl:result-document>
    </xsl:for-each-group>
  </xsl:template>

</xsl:stylesheet>

後で XSLT 1.0 と EXSLT に変換しようとするかもしれません。

[編集] 以下は XSLT 1.0 と EXSLT に変換する試みです:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:exsl="http://exslt.org/common"
  extension-element-prefixes="exsl"
  exclude-result-prefixes="exsl"
  version="1.0">

  <xsl:param name="n" select="3"/>

  <xsl:output method="xml" indent="yes"/>

  <xsl:key name="person-by-firstname" 
           match="Person"
           use="FirstName"/>

  <xsl:template match="People">
    <xsl:variable name="groups">
      <xsl:for-each select="Person[generate-id() = generate-id(key('person-by-firstname', FirstName)[1])]">
        <group>
          <xsl:copy-of select="key('person-by-firstname', FirstName)"/>
        </group>
      </xsl:for-each>
    </xsl:variable>
    <xsl:for-each select="exsl:node-set($groups)/group[(position() - 1) mod $n = 0]">
      <exsl:document href="groupTest{position()}.xml">
        <People>
          <xsl:copy-of select="Person | following-sibling::group[position() &lt; $n]/Person"/>
        </People>
      </exsl:document>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>
于 2010-11-15T09:50:40.290 に答える