使用XSLT生成元数据

时间:2008-11-11 10:37:06

标签: xslt xpath xsd metadata datamodel

我经常通过转换遗留系统的专有数据模型来创建XSD架构。这非常好。但是,遗留系统只允许我指定参数的非常基本的属性,例如数据类型(intstring等。)。

我想通过一种允许我添加元数据的机制来增强XSL转换,以便为转换提供更多细节。我想到了类似于Java属性符号的东西,可以为XPath分配属性。

想象一下以下示例:

遗留系统数据模型(实际上很整洁,但最适合演示目的)

<datamodel>
  <customer>
    <firstName type="string"/>
    <lastName type="string"/>
    <age type="int">
  <customer>
</datamodel>

元数据

customer/firstName/@nillable=false
customer/lastName/@nillable=false
customer/age/@nillable=true
customer/firstName/@minOccurs=1
customer/firstName/@maxOccurs=1
customer/lastName/@minOccurs=1
customer/lastName/@maxOccurs=1

生成的XSD架构

...
<xs:complexType name="customerType">
  <xs:sequence>
    <xs:element name="firstName" type="xs:string" nillable="false" minOccurs="1" maxOccurs="1"/>
    <xs:element name="lastName" type="xs:string" nillable="false" minOccurs="1" maxOccurs="1"/>
    <xs:element name="age" type="xs:int" nillable="true"/>
  </xs:sequence>
</xs:complexType>
...

你怎么看?有没有办法将元数据包含到XSL样式表中?

2 个答案:

答案 0 :(得分:2)

最佳解决方案是通过添加缺少的元数据来修改旧数据。

修改后的“datamodel”词汇表的实例可能是这样的:

<datamodel xmlns:nm="my:new.meta">
    <customer>
        <firstName type="string"
                   nm:nillable="false"
                   nm:minOccurs="1"
                   nm:maxOccurs="1"
                   />
        <lastName type="string"
                  nm:nillable="false"
                  nm:minOccurs="1"
                  nm:maxOccurs="1"
                  />
        <age type="int" nm:nillable="true"/>
    </customer>
</datamodel>

将新属性放在单独的命名空间中是一种很好的方法,可以轻松地将它们与已经支持的属性区分开来。通常不建议在命名空间中使用属性,因此如果要避免这种情况,可以使用子元素(属于新命名空间)而不是属性。使新属性属于不同的命名空间可能会导致传统架构验证不拒绝它们。

如果由于某些原因无法修改遗留数据,我建议不要在XSLT样式表本身中包含新属性(这是完全可能的,例如将其定义为全局内容{ {1}}),但要将这些新属性作为单独的XML文件或一组或多个XML文件提供。

使用XSLT document()函数在XSLT转换期间可以动态访问任何XML文件。具有新属性的XML文件的实例可能如下所示:

<xsl:variable>

希望这会有所帮助。

干杯,

Dimitre Novatchev

答案 1 :(得分:1)

“您如何看待这一点?”

两个三件事。

  1. 修复旧版元数据。这是XML。添加东西给它。如果必须,添加命名空间。

  2. 如果您无法修复遗留元数据,谁将维护第二组不是XML表示法的元数据?谁将进行元数据更改的双重录入?有人跟进的几率是多少?

  3. 考虑将XML用于其他元数据,而不是伪XPath。一致性将帮助那些在你弄清楚发生了什么后来到的人。