2011-04-22 21 views
3

xsl:keyおよびxpath関数key()およびid()を使用したXSL変換にXMLSchema内でID/IDREFSを使用する方法を教えてください。XMLスキーマでのID/IDREFSの使用

私は、次のDTDを使用している場合は、すべての罰金

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

である私は、XSL定義することができます:キーをし、正常に

<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> 

キー()とid()XPath関数を使用しかし、私は移行した場合私の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の主義のようなものがないので、多くの移行はありますか?

種類が ドミニク

+0

質問サンプルでは、​​あなたのスキーマに 'usecases'要素の定義がないのはなぜですか? –

答えて

2

に関しては、私はまだこの機能を使用しますが、Defining Keys & their Referencesによると、keykeyrefを使用してIDREF以上推奨されるアプローチであるように思われていません。

パート量要素は、一部の説明を対応していることを確認するために、我々はそれらの要素(<selector xpath="r:regions/r:zip/r:part"/>)のnumber属性(<field xpath="@number"/>)がpNumKeyキーを参照しなければならないと言います。 numberのこの宣言がkeyrefであるということは、その値が一意でなければならないわけではありませんが、同じ値を持つpNumKeyが存在しなければならないことを意味します。

関連する問題