Использование ID/IDREFS в XML-схеме
Как я должен использовать ID/IDREFS в XMLSchema, чтобы использовать его для XSL-преобразования с функциями xsl:key и xpath key() и id()?
Если я использую следующий 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 и успешно использовать функции XPath key() и id ()
<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? Но это большая миграция, потому что нет таких вещей, как XML keyrefs, не так ли?
С наилучшими пожеланиями Доминик
1 ответ
Я еще не использовал эту функцию, но в соответствии с определением ключей и их ссылок, используя key
а также keyref
кажется рекомендуемым подходом IDREF
,
Чтобы гарантировать, что элементы количества детали имеют соответствующие описания деталей, мы говорим, что
number
атрибут (<field xpath="@number"/>
) из этих элементов (<selector xpath="r:regions/r:zip/r:part"/>
) должен ссылаться наpNumKey
ключ. Эта декларацияnumber
какkeyref
не означает, что его значение должно быть уникальным, но это означает, что должно существоватьpNumKey
с тем же значением.