我正在处理由四个步骤组成的XSL转换。我想出了各个步骤,但我一直在坚持如何把它们放在一起。这是我想做的事:带有标记化和不同值的复杂XSLT转换
源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标签都有效,在逗号分割的值,并把它们放在一个列表
- 列表
- 删除双occurances列表中的
- 对于每一个新的每个值创建一个新的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中的变量为只读的问题。有没有办法以某种方式连接单个解决方案来获得所需的结果?
从您的描述来看,您似乎希望有一种样式表可以执行某种形式的魔术;给出由Dominik,Andrea,Alex和Andre组成的人员名单,它必须删除有关Andrea,Alex和Andre的信息,并添加有关Dorothea,Fiona,Fabian,Florian,Gabi和Gert的信息。凉! – 2013-02-12 17:16:03
你是对的 - 现在你提到它。我必须在代码发布之前对代码进行一些修改,并忘记更改数据。对不起,这是我的错。幸运的是,Martin Honnen能够弄清楚我的意思:)。谢谢你提及 - 下次我会更加小心。 – 2013-02-13 09:11:31