3

我应该如何在 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 keyrefs 这样的东西,不是吗?

亲切的问候多米尼克

4

1 回答 1

2

我尚未使用此功能,但根据定义键及其参考,使用 keykeyref似乎是推荐的方法IDREF

为了保证part-quantity元素有对应的part描述,我们说那些元素( )的number属性( )必须引用key。as a 的这种声明并不意味着它的值必须是唯一的,但它确实意味着必须存在具有相同值的 a。<field xpath="@number"/><selector xpath="r:regions/r:zip/r:part"/>pNumKeynumberkeyrefpNumKey

于 2011-06-29T03:55:35.633 回答