別の構造に転送したい XML ドキュメントがあります。ドキュメントの例は次のようになります。
<application>
<contactPerson>
<name>Dominik</name>
<countryCode>DE</countryCode>
</contactPerson>
<contactPerson>
<name>Dorothea</name>
<countryCode>DE</countryCode>
</contactPerson>
<contactPerson>
<name>Fiona</name>
<countryCode>FR</countryCode>
</contactPerson>
<contactPerson>
<name>Fabian</name>
<countryCode>FR</countryCode>
</contactPerson>
<contactPerson>
<name>Florian</name>
<countryCode>FR</countryCode>
</contactPerson>
<contactPerson>
<name>Gabi</name>
<countryCode>GB</countryCode>
</contactPerson>
<contactPerson>
<name>Gert</name>
<countryCode>GB</countryCode>
</contactPerson>
</application>
ここでやりたいことは、要素を国別にグループ化することです。つまり、結果は次のようになります。
<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>
すべての国を選択するために XPath の for-each パターンを使用していますが、想定どおりの動作をしません。私のパターンは次のようになります。
<xsl:template match="/">
<application>
<xsl:for-each select="/application/contactPerson/countryCode[not(.=preceding-sibling::*/application/contactPerson/countryCode)]">
<memberState>
<countryCode>
<xsl:value-of select="."/>
</countryCode>
<contactPerson>
<name>
<xsl:value-of select="../name"/>
</name>
</contactPerson>
</memberState>
</xsl:for-each>
</application>
</xsl:template>
エラーは、コンパイルされない XPath 式のどこかにある可能性があります。私はそれを次のように変更しました
<xsl:for-each select="/application/contactPerson/countryCode[not(.=preceding-sibling::*)]">
私はすでに自分の木の正しい位置にいると思うからです。このソリューションはコンパイルされますが、「先行兄弟」を使用して意図したように国の一意のリストは得られませんが、代わりに完全なリストが得られます。
私の問題の解決策が必要であることに加えて、ここで実際に何が起こっているのかを理解するための助けに特に感謝します.
- 2 番目のソリューションのように相対パスを指定することは可能ですか、それとも毎回完全なパスを指定する必要がありますか?
- 国コードの一意のリストを作成するための正しい軌道に乗っていますか、それとも一般的に別の方法で実装されますか?
- 私が探しているソリューションは実際に XSLT で実装できますか?
大変お世話になりました。