1

xsl 2.0 を使用して、言語名に基づいて異なる xml ファイルを作成しようとしています。私の入力xmlには、「en」と「es」の2つの言語しかありません。

  1. すべての「en」ベースの人は en.xml に移動し、
  2. すべての「es」ベースの人は es.xml に移動し、
  3. 「en」と「es」の両方を持っているすべての人は、en.xml と es.xml の両方にアクセスする必要があります。

私の入力 XML: ソース xml は、人物、住所、言語のリストに関するものです

<persons>
    <person name="Alice">
        <Addresses>
            <Address type ="personal">
                <language name = "en">
                </language>
            </Address>
            <Address type ="business">
                <language name = "en">
                </language>
            </Address>
        </Addresses>
    </person>
    <person name="Bob">
        <Addresses>
            <Address type ="personal">
                <language name = "es">
                </language>
            </Address>
            <Address type ="business">
                <language name = "es">
                </language>
            </Address>
        </Addresses>
    </person>
    <person name="Stacy">
        <Addresses>
            <Address type ="personal">
                <language name = "en">
                </language>
            </Address>
            <Address type ="business">
                <language name = "es">
                </language>
            </Address>
        </Addresses>
    </person>
</persons>

出力ファイル en.xml には以下が含まれます。

language 属性値 = "en" を含むすべての人は、en.xml ファイルに移動する必要があります。この場合、Alice と Stacy の両方が en.xml に移動する必要があります。

    <person name="Alice">
        <Addresses>
            <Address type ="personal">
                <language name = "en">
                </language>
            </Address>
            <Address type ="business">
                <language name = "en">
                </language>
            </Address>
        </Addresses>
    </person>
        <person name="Stacy">
        <Addresses>
            <Address type ="personal">
                <language name = "en">
                </language>
            </Address>
            <Address type ="business">
                <language name = "es">
                </language>
            </Address>
        </Addresses>
    </person>

出力ファイル es.xml には次のものが含まれます。

language 属性値 = "es" を含むすべての人は、en.xml ファイルに移動する必要があります。この場合、Bob と Stacy の両方が es.xml に移動する必要があります。

    <person name="Bob">
        <Addresses>
            <Address type ="personal">
                <language name = "es">
                </language>
            </Address>
            <Address type ="business">
                <language name = "es">
                </language>
            </Address>
        </Addresses>
    </person>
    <person name="Stacy">
        <Addresses>
            <Address type ="personal">
                <language name = "en">
                </language>
            </Address>
            <Address type ="business">
                <language name = "es">
                </language>
            </Address>
        </Addresses>
    </person>

これまでの私のXSL:

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

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

<xsl:template match="/">
    <xsl:for-each select="//persons">
       <xsl:variable name="filename"
             select="concat('allpersons/',//persons/person/Addresses/Address/language/@name,'.xml')" />
       <xsl:value-of select="$filename" />  <!-- Creating  -->
       <xsl:result-document href="{$filename}" format="xml">
             <xsl:value-of select="."/>
       </xsl:result-document>
     </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

ソリューションには、「en」、「es」などの属性の静的一致を含めないでください。多くの言語があるためです。どんな助けでも大歓迎ですか?

参考文献: http://www.ibm.com/developerworks/xml/library/x-tipmultxsl/index.html

4

1 に答える 1

1

XSLT 2.0 のサンプルを次に示します。

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

<xsl:output indent="yes"/>

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

<xsl:template match="persons">
  <xsl:for-each-group select="person" group-by="Addresses/Address/language/@name">
    <xsl:result-document href="{current-grouping-key()}.xml">
      <xsl:apply-templates select="current-group()"/>
    </xsl:result-document>
  </xsl:for-each-group>
</xsl:template>

<xsl:template match="person/Addresses">
  <xsl:if test="Address/language/@name = current-grouping-key()">
    <xsl:next-match/>
  </xsl:if>
</xsl:template>

</xsl:stylesheet>

ルートなしでこれらの結果ファイルを本当に作成したいのかどうかはわかりませんが、ルートが必要な場合はpersonsテンプレートを次のように変更します

<xsl:template match="persons">
  <xsl:for-each-group select="person" group-by="Addresses/Address/language/@name">
    <xsl:result-document href="{current-grouping-key()}.xml">
      <persons>
        <xsl:apply-templates select="current-group()"/>
      </persons>
    </xsl:result-document>
  </xsl:for-each-group>
</xsl:template>
于 2012-09-14T17:36:50.683 に答える