我们如何将同一层次结构级别的重复相关项转换为嵌套良好的元素?
我有类似这样的 XML 作为来自表单引擎的复杂 SQL 查询的输出,收集信息,如简历,其中一些字段(如以前的工作)可以重复。但是,它们不会以友好的方式输出:
<People>
<Person>
<Field1>Fred</Field1>
<Field2>Head Chef</Field2>
<Field3>The Ritz Hotel</Field3>
<Field2>Bottle Washer</Field2>
<Field3>Dog and Duck</Field3>
</Person>
<Person>
<Field1>Mary</Field1>
<Field2>Chief Executive</Field2>
<Field3>BigCorp</Field3>
<Field2>Manager</Field2>
<Field3>LargeCorp</Field3>
<Field2>Mail Clerk</Field2>
<Field3>SmallCorp</Field3>
</Person>
</People>
我需要做的是将其转换为其他 XML,将重复的 Field2 和 Field3 集分离为单独的父元素,就像这样......
<People>
<Person>
<Name>Fred</Name>
<Jobs>
<Job>
<JobTitle>Head Chef</JobTitle>
<Employer>Ritz Hotel</Employer>
</Job>
<Job>
<JobTitle>Bottle Washer</JobTitle>
<Employer>Dog and Duck</Employer>
</Job>
</Jobs>
</Person>
<Person>
<Name>Mary</Name>
<Jobs>
<Job>
<JobTitle>Chief Executive</JobTitle>
<Employer>BigCorp</Employer>
</Job>
<Job>
<JobTitle>Manager</JobTitle>
<Employer>LargeCorp</Employer>
</Job>
<Job>
<JobTitle>Mail Clerk</JobTitle>
<Employer>SmallCorp</Employer>
</Job>
</Jobs>
</Person>
</People>
字段将始终按顺序排列 - 即 Field1 然后是 Field2,然后是可选的另一个 Field1 和 Field2,可选地重复 ad nauseum。我有代码可以为单次出现的字段(当然有很多)做简单的事情,但是我可能需要像这样的几个重复字段集(教育历史、就业历史等)整理。不要担心从哪里获得翻译的名称(例如从“Field3”到“Employer”),我想我可以解决这个问题。如果它有助于解析,我可以调整输入元素的名称 - 例如,附加一个序列序号来对相关元素进行分组,例如:
...
<Field2_Seq1>Head Chef</Field2_Seq1>
<Field3_Seq1>The Ritz Hotel</Field3_Seq1>
<Field2_Seq2>Bottle Washer</Field2_Seq2>
<Field3_Seq2>Dog and Duck</Field3_Seq2>
....
我为此苦苦挣扎——我是 XSL 的新手,并且承受着让它工作的压力(我们什么时候不工作?),所以非常感谢任何帮助。
谢谢,基思。
编辑:实际上,重复集中有更多字段(例如 Field4、Field5...FieldN)并且它们是可选的,因此我们可能在序列中省略了项目:那些存在的项目将按升序排列,但不一定按顺序排列. 新 Job 元素的触发器是数字倒退(例如从 Field6 到 Field3)。所以我们需要应对,例如
...
<Field1>John</Field1>
<Field4>Something</Field4>
<Field6>Missed some more</Field6>
<Field2>New Job</Field2>
...
产生类似(部分)的东西
...
<Person>
<Name>John</Name>
<Job>
<SomeElement>Something</SomeElement>
<YetAnother>Missed some more</YetAnother>
</Job>
<Job>
<JobTitle>New Job</JobTitle>
...
为不充分的原始问题示例道歉。