【发布时间】:2015-04-19 08:22:23
【问题描述】:
我对 XSL-T 比较陌生。 我的要求很简单。我想将 xml 中不存在的 Schema 的缺失元素添加为空标签。
例如,
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
attributeFormDefault="unqualified"
elementFormDefault="qualified">
<xs:element name="RootElement">
<xs:complexType>
<xs:sequence>
<xs:element name="XMLTagOne">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="value1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="RepeatableElementOne" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="value2"/>
<xs:element name="RepeatableElemenTwo" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="value3"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
考虑一下这个 i/p:
<RootElement>
<RepeatableElementOne>
<value2>bb</value2>
<RepeatableElemenTwo>
<value3>cc</value3>
</RepeatableElemenTwo>
<RepeatableElemenTwo>
<value3>dd</value3>
</RepeatableElemenTwo>
</RepeatableElementOne>
<RepeatableElementOne>
<value2>ee</value2>
</RepeatableElementOne>
</RootElement>
对于这个 i/p,我希望将元素 <XMLTagOne> 和 <RepeatableElemenTwo> 添加为空标签。
预期 O/P:
<RootElement>
<XMLTagOne> <!-- Added as empty tag though not present in i/p-->
<value1></value1>
</XMLTagOne>
<RepeatableElementOne>
<value2>bb</value2>
<RepeatableElemenTwo>
<value3>cc</value3>
</RepeatableElemenTwo>
<RepeatableElemenTwo>
<value3>dd</value3>
</RepeatableElemenTwo>
</RepeatableElementOne>
<RepeatableElementOne>
<value2>ee</value2>
<RepeatableElemenTwo>
<value3></value3>
</RepeatableElemenTwo>
</RepeatableElementOne>
</RootElement>
通过一些初步研究,我发现我必须使用与所有元素匹配的标识模板遍历每个节点。 你能建议我如何解决这个问题吗? 谢谢。
编辑
我的设计方法:
- 根据 xsd 创建中间 xml 文档。
类似的,
<Root>
<a></a>
<b></b>
<Root>
- 遍历所有单个节点。 (
Identity Template??) - 从我手头的源 XML 中获取每个节点的值。
这种方法的问题
- 重复元素。
- 必须检查计数是否 > 1。如果是,则使用
<xsl:for-each>处理源文档中的节点。
【问题讨论】:
-
您希望 XSLT 代码解析模式,然后根据模式添加元素吗?或者您是否知道在编写 XSLT 时缺少某些元素而只需要 XSLT 来添加这些特定元素?
-
在这种情况下,说明需求很容易,将需求转化为设计很难,而将设计转化为代码(可能)很容易。我建议您专注于第二阶段:具体来说,定义一个满足您要求的算法,而不用担心如何在 XSLT 中实现该算法。
-
嗨,马丁。是否可以将源 XML 文档与从模式中创建的格式化文档(包含所有元素,即空标签)进行比较,并将所有缺少的元素添加到源中?我是新手,如有错误请指正。
-
@michael 我已经用可能的设计解决方案编辑了我的问题。请查看并分享您宝贵的 cmets。
-
Related question (仍然没有答案),您创建“中间 xml 文件”的方法实际上是等效的。