【发布时间】:2012-06-28 16:10:11
【问题描述】:
我们如何将同一层次结构中重复的相关项转换为嵌套良好的元素?
我有类似这样的 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>
...
对原始问题示例不充分表示歉意。
【问题讨论】:
-
那么您希望如何处理
Field4、Field5和Field5?应该为他们每个人生成什么? -
您可以使用 XSLT 2.0 还是仅限于 XSLT 1.0?
-
你能选择一个答案吗?
标签: xslt