私は4つのステップで構成されるXSL変換に取り組んでいます。私は個々のステップを理解しましたが、それらを組み合わせる方法に固執しています。これが私がやりたいことです:
ソースXMLドキュメント:
<application>
<contactPerson>
<name>Dominik</name>
<countryCode>DE,SP</countryCode>
</contactPerson>
<contactPerson>
<name>Andrea</name>
<countryCode>FR</countryCode>
</contactPerson>
<contactPerson>
<name>Alex</name>
<countryCode>FR,DE</countryCode>
</contactPerson>
<contactPerson>
<name>Andre</name>
<countryCode>FR</countryCode>
</contactPerson>
</application>
ターゲットXMLドキュメント:
<application>
<memberState>
<countryCode>DE</countryCode>
<contactPerson>
<name>Dominik</name>
</contactPerson>
<contactPerson>
<name>Dorothea</name>
</contactPerson>
</memberState>
<memberState>
<countryCode>FR</countryCode>
<contactPerson>
<name>Fiona</name>
</contactPerson>
<contactPerson>
<name>Fabian</name>
</contactPerson>
<contactPerson>
<name>Florian<name>
</contactPerson>
</memberState>
<memberState>
<countryCode>GB</countryCode>
<contactPerson>
<name>Gabi</name>
</contactPerson>
<contactPerson>
<name>Gert</name>
</contactPerson>
</memberState>
</application>
プロセスの次の手順を特定しました。
- countryCode -Tagsを取得し、値をコンマで分割して1つのリストに入れます
- リスト内の二重出現を削除します
- リスト内の値ごとに1つの新しいcountryCodeノードを作成します
- 新しいcountryCodeノードごとに、その国の連絡担当者であるすべての人を追加します
今、私はステップ1を行う方法を理解しました:
<memberState>
<countryCodes>
<xsl:for-each select="/application/contactPerson">
<xsl:for-each select="tokenize(./countryCode, ',')">
<countryCode>
<xsl:value-of select="."/>
</countryCode>
</xsl:for-each>
</xsl:for-each>
</countryCodes>
</memberState>
ステップ2では、を使用できますdistinct-values()
。
ステップ3+ステップ4では、次のソリューションを実装しました。
<xsl:for-each select="/application/contactPerson/countryCode[not(. = ../preceding-sibling::*/countryCode)]">
<memberState>
<countryCode>
<xsl:value-of select="."/>
</countryCode>
<xsl:for-each select="/application/contactPerson[countryCode = current()]">
<contactPerson>
<name>
<xsl:value-of select="name"/>
</name>
</contactPerson>
</xsl:for-each>
</memberState>
</xsl:for-each>
しかし、どうすればすべてをまとめることができますか?私の考えは、各ステップの出力を変数に保存して次のステップで操作することでしたが、XSLTの変数が読み取り専用であるという事実に問題がありました。単一のソリューションを何らかの方法で接続して、目的の結果を得る方法はありますか?