在XML Schema中使用ID / IDREFS

时间:2011-04-22 12:13:32

标签: xslt xsd dtd idref

如何在XMLSchema中使用ID / IDREFS以便使用xsl:key和xpath函数key()和id()来进行XSL转换?

如果我使用以下DTD一切都很好

<!ELEMENT role EMPTY>
<!ATTLIST role
   name   ID    #REQUIRED>
<!ELEMENT usecases (usecase)+>
<!ELEMENT usecase EMPTY>
<!ATTLIST usecase
   roles IDREFS  #REQUIRED
   name   CDATA   #REQUIRED>

我可以定义xsl:key并成功使用key()和id()XPath函数

<xsl:key name="usecase2role" match="usecase" use="id(@roles)/@name" />
<xsl:template match="role">
    <xsl:apply-templates select="key('usecase2role', @name)" mode="byrole">
        <xsl:with-param name="roleName" select="@name"/>
    </xsl:apply-templates>
</xsl:template>
<xsl:template match="usecase" mode="byrole">
    <xsl:param name="roleName"/>
insert into permission(roleId, usecaseId) values (<xsl:value-of select="$roleName"/>, <xsl:value-of select="@name"/>);
</xsl:template>

但是如果我将DTD迁移到XMLSchema中,那么相同的XSL转换只会生成一个空文档。

<xsd:complexType name="role">
    <xsd:attribute name="name" type="xsd:ID" use="required"/>
</xsd:complexType>
<xsd:complexType name="usecase">
    <xsd:attribute name="name" use="required"/>
    <xsd:attribute name="roles" use="required" type="xsd:IDREFS"/>
</xsd:complexType>

或者使用ID / IDREFS的整个方法是错误的,我必须将其更改为XML Key吗?但这就是很多迁移,因为没有像XML keyref这样的东西,不是吗?

亲切的问候 多米尼克

1 个答案:

答案 0 :(得分:2)

我尚未使用此功能,但根据Defining Keys & their References,使用keykeyref似乎是IDREF的推荐方法。

  

为确保零件数量元素具有相应的零件描述,我们说这些元素(number)的<field xpath="@number"/>属性(<selector xpath="r:regions/r:zip/r:part"/>)必须引用{{1}钥匙。此pNumKey声明为number并不意味着其值必须是唯一的,但它确实意味着必须存在具有相同值的keyref