我正在研究由四个步骤组成的 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,以逗号分隔值并将它们放在一个列表中
- 删除列表中的重复出现
- 为列表中的每个值创建一个新的countryCode -node
- 对于每个新的countryCode -node,添加该国家的所有联系人
现在我想出了如何做第 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 中的变量是只读的这一事实的问题。有没有办法以某种方式连接单个解决方案以获得所需的结果?