我有想要转移到另一个结构中的 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::*)]">
因为我认为我已经在我的树的正确位置。该解决方案可以编译,但它并没有按照我的意图通过使用“preceding-sibling”给我一个唯一的国家列表,而是完整的列表。
除了我需要解决我的问题之外,我会特别感谢一些帮助以了解这里实际发生的事情。
- 是否可以像我的第二个解决方案一样提供相对路径,还是每次都必须提供完整路径?
- 我是否在制作唯一的国家代码列表的正确轨道上,或者通常会以不同的方式实施?
- 我正在寻找的解决方案是否可以通过 XSLT 实现?
我非常感谢您的帮助。