Использование идентификаторов / IDREFS в XML-схеме

#xslt #xsd #dtd #idref

#xslt #xsd #dtd #idref

Вопрос:

как я должен использовать 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 Key? Но это большая миграция, потому что не существует таких вещей, как XML keyrefs, не так ли?

С уважением, Доминик

Комментарии:

1. В примере вопроса, почему в вашей схеме отсутствует определение usecases элемента?

Ответ №1:

Я еще не использовал эту функцию, но, согласно определению ключей и их ссылок, использование key и keyref , по-видимому, является рекомендуемым подходом IDREF .

Чтобы гарантировать, что элементы part-quantity имеют соответствующие описания деталей, мы говорим, что number атрибут ( <field xpath="@number"/> ) этих элементов ( <selector xpath="r:regions/r:zip/r:part"/> ) должен ссылаться на pNumKey ключ. Это объявление number как a keyref не означает, что его значение должно быть уникальным, но это означает, что должно существовать a pNumKey с таким же значением.