2009-07-08 8 views
2

XSDのコンテンツはthis fileです。XSLT:名前付きテンプレートを使用してXSDをXSDにコピーする

<?xml version="1.0" encoding="ISO-8859-1"?> 

<xsl:template match="node()|@*" name="copy"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="xs:complexType"> 
    <xsl:call-template name="copy"/> 
</xsl:template> 

<xsl:template match="xs:element"> 
    <xsl:choose> 
     <xsl:when test="contains(@type, 'core')"> 
      core 
     </xsl:when> 
     <xsl:when test="contains(@type, 'AcRec')"> 
      AcRec 
     </xsl:when>   
    </xsl:choose> 
</xsl:template> 

アイデアは特定のノードを選択することである。

このXSLを使用して、Iは所望の要素の内容をコピーすることができxsdを作成し、すべてのサポート要素をa単一のファイルをタイプ値に基づいて検索します。私がいたアイデアは、テンプレートの組み合わせを使用することでした

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:core="urn:org:pesc:core:CoreMain:v1.2.0" xmlns:AcRec="urn:org:pesc:sector:AcademicRecord:v1.1.0"> 
<xs:complexType name="PersonType"> 
    <xs:sequence> 
     <xs:element name="SchoolAssignedPersonID" type="core:SchoolAssignedPersonIDType" minOccurs="0"/> 
     <xs:element name="SIN" type="core:SINIDType" minOccurs="0"/> 
     <xs:element name="NSN" type="core:NSNIDType" minOccurs="0"/> 
     <xs:element name="AgencyAssignedID" type="core:AgencyAssignedIDType" minOccurs="0"/> 
     <xs:element name="RecipientAssignedID" type="core:RecipientAssignedIDType" minOccurs="0"/> 
     <xs:element name="SSN" type="core:SSNType" minOccurs="0"/> 
     <xs:element name="Birth" type="core:BirthType" minOccurs="0"/> 
     <xs:element name="Name" type="core:NameType"/> 
     <xs:element name="AlternateName" type="core:NameType" minOccurs="0" maxOccurs="unbounded"/> 
     <xs:element name="HighSchool" type="AcRec:HighSchoolType" minOccurs="0" /> 
     <xs:element name="Contacts" type="AcRec:ContactsType" minOccurs="0" maxOccurs="unbounded"/> 
     <xs:element name="Gender" type="core:GenderType" minOccurs="0"/> 
     <xs:element name="Residency" type="AcRec:ResidencyType" minOccurs="0"/> 
     <xs:element name="Deceased" type="core:DeceasedType" minOccurs="0"/> 
     <xs:element name="NoteMessage" type="core:NoteMessageType" minOccurs="0" maxOccurs="unbounded"/>   
    </xs:sequence> 
</xs:complexType> 
<xs:simpleType name="SchoolAssignedPersonIDType" /> 
<xs:simpleType name="SINIDType" /> 
<xs:simpleType name="NSNIDType" /> 
<xs:simpleType name="AgencyAssignedIDType" /> 
<xs:complexType name="HighSchoolType"> 
    <xs:sequence> 
     <xs:element name="OrganizationName" type="core:OrganizationNameType"/> 
     <xs:element name="OPEID" type="core:OPEIDType"/> 
     <xs:element name="NCHELPID" type="core:NCHELPIDType"/> 
     <xs:element name="IPEDS" type="core:IPEDSType"/> 
     <xs:element name="ATP" type="core:ATPType"/> 
     <xs:element name="FICE" type="core:FICEType"/> 
     <xs:element name="ACT" type="core:ACTType"/> 
     <xs:element name="CCD" type="core:CCDType"/> 
     <xs:element name="CEEBACT" type="core:CEEBACTType"/> 
     <xs:element name="CSIS" type="core:CSISType"/> 
     <xs:element name="USIS" type="core:USISType"/> 
     <xs:element name="ESIS" type="core:ESISType"/> 
     <xs:element name="DUNS" type="core:DUNSType"/> 
    </xs:sequence> 
</xs:complexType> 
<xs:simpleType name="OrganizationNameType" /> 
<xs:simpleType name="OPEIDType" /> 

- 要素&サブ要素を(XSをexludingつかむために最初のコピーを:

所望の出力は、最終的には次のようになります。注釈とxs:制限)。 2番目のテンプレートは、要素のxs:要素の内容を反復して、他のファイルから参照を取得します。さらに、xs:groupsが検出されると、xs:group ref要素はxs:group定義内の要素の内容に置き換えられます。

+0

あなたは何とか達成しようとしていることを忘れています。あなたは少なくとも希望の出力を投稿できますか? – Tomalak

答えて

0

match属性のテンプレートを強制的に使用することはできません。そのようなテンプレートは、それにマッチするすべての要素に適用され、それらの要素にのみ適用されます。したがって、node()に一致する子要素の一部がcomplexTypeの場合、自動的に適用されます。

もちろん、nameとしてから<xsl:call-template name="...">を使用してもかまいません。

0

あなたは残りの部分の前に

<xsl:apply-templates select="complexType"/> 
<xsl:apply-templates select="node()[local-name() != 'complexType']|@*"/> 

この意志出力すべての複雑なノードを使用することができます。また、順序を変更するには、実行する必要があります。

<xsl:apply-templates select="node()[local-name() != 'complexType']|@*"/> 
<xsl:apply-templates select="complexType"/> 
1

これは、暗闇の中でショットのビットですが、私はあなたのXSLスタイルシートに名前空間の正しい取り扱いが欠けていると思います。

作成した "complexType"テンプレートは、ノード「xs:complexType」と一致しません。

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
> 

、あなたはあまりにも、それを使用する必要があります:あなたはこのように、 xs名前空間を宣言しなければなりません

<xsl:template match="xs:complexType"> 
    <!-- ... --> 
</xsl:template> 

<xsl:template match="xs:element"> 
    <!-- ... --> 
</xsl:template> 

私はその変更を行ったら、あなたのスタイルシートは私を与えた:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="PersonType"> 
    <xs:sequence>core core core core core core core core core AcRec AcRec core AcRec core core</xs:sequence> 
    </xs:complexType> 
</xs:schema> 

これは、テンプレートが使用されていることを明確に示しています。 XSLは常に最も具体的なテンプレートを使用しています。CSSはCSSが最も特定のルールを使用しているのと同じように、どのノードでも見つけることができます。

<xsl:template match="node()|@*"><xsl:template match="complexType">よりもあまり具体的ではありませんが、xs名前空間を使用しない限り、後者は何も一致しません。

P.S:いくつかの発言:

  • <xsl:otherwise>は、それが空である場合は、それを残すことができ、必須ではありません。
  • <xsl:call-template name="copy" />を使用する必要はありません。どの出力を表示したいかを定義したら、それを取り除いて、より洗練されたアプローチを採用することができます。<xsl:when>テストではsubstring-before(@type, ':') = 'core'contains(@type, 'core')以上にすることをお勧めします。後者はエラーが起こりやすい。
  • これはおそらく例のためのものですが、出力で不要な空白を避けるには、<xsl:text>core</xsl:text>を使用してください。
+0

ありがとうございます - 私はこれに苦労しており、本当に助けに感謝します。 –

関連する問題