我做了一个艰难的时期制定的问题标题。也许这个例子会更有意义。XSLT 1.0 - 合并与子节点的兄弟节点为新的复合节点
假设我有一个看起来像这样的系统中的一个XML文档:
<root>
<phone_numbers>
<phone_number type="work">123-WORK</phone_number>
<phone_number type="home">456-HOME</phone_number>
<phone_number type="work">789-WORK</phone_number>
<phone_number type="other">012-OTHER</phone_number>
</phone_numbers>
<email_addresses>
<email_address type="home">[email protected]</email_address>
<email_address type="other">[email protected]</email_address>
<email_address type="home">[email protected]</email_address>
<email_address type="work">[email protected]</email_address>
<email_address type="other">[email protected]</email_address>
<email_address type="other">[email protected]</email_address>
</email_addresses>
</root>
而且我必须适应这些成这样,使他们可以在系统B中使用的结构:
<root>
<addresses>
<address name="work1">
<phone_number>123-WORK</phone_number>
<email_address>[email protected]</email_address>
</address>
<address name="work2">
<phone_number>789-WORK</phone_number>
</address>
<address name="other1">
<phone_number>012-OTHER</phone_number>
<email_address>[email protected]</email_address>
</address>
<address name="other2">
<email_address>[email protected]</email_address>
</address>
<address name="other3">
<email_address>[email protected]</email_address>
</address>
<address name="home1">
<phone_number>456-HOME</phone_number>
<email_address>[email protected]</email_address>
</address>
<address name="home2">
<email_address>[email protected]</email_address>
</address>
</addresses>
</root>
可以有任何数(从0到无穷大,因为据我所知),每种类型的电子邮件地址。此外,还可以是任意数量的每种类型的电话号码,和一种类型的电话号码的数量不必匹配相同类型的电子邮件地址的数量。
第一文档中的电子邮件地址和电话号码是不是真的彼此相关,但它们在它们添加到系统A的顺序输入
我要配对的电子邮件和电话数字增长型以适应系统B,我想它们配对,使X型的第一个电话号码是搭配X型的第一个电子邮件地址等X型的没有电话号码是搭配的电子邮件比十,其他类型的
因为我有配对起来,由于他们的顺序被输入到系统中,我会去寻找对之间的关系最密切,我想订购他们THI的方式。我必须告诉用户去查看结果,确保它们有意义,但我必须将它们配对 - 别无选择。
使事情复杂化,我的实际XML文档有更多的节点,我需要与phone_numbers和email_addresses合并,并且我有两个以上的@types
。
另外一个注意:我已经计算节点的最大数量与任何给定的@type
,所以我的例子文档,我知道一个@type
的<address>
节点的最大数目为3(三级<email_address>
与@type=other
节点=与@name=otherX
3个<address>
节点)。
类型的顺序是否重要? “other”类型在第二个“email_address”或第四个“phone_number”之前不会出现,但该类型在输出中是第二个。 – 2011-05-13 20:45:27
类型的订购无关紧要。 – Tex 2011-05-13 21:51:08
好问题,+1。看到我的解决方案相当简单的解决方案:) – 2011-05-14 02:28:42