2012-04-05 13 views
3

私はこのように見える要素と、大きなXSDを持っている:これらの埋め込み要素を親要素の属性に変換するにはどうすればよいですか?

<xs:element name="ProgramName" type="xs:string" minOccurs="0"> 
    <xs:annotation> 
    <xs:documentation>PN</xs:documentation> 
    </xs:annotation> 
</xs:element> 
<xs:element name="TestItem" type="xs:string" minOccurs="0"> 
    <xs:annotation> 
    <xs:documentation>TA</xs:documentation> 
    </xs:annotation> 
</xs:element> 

私はこのように、祖父母要素の属性に<documentation>要素を折りたたむしたいと思います:

<xs:element name="ProgramName" type="xs:string" minOccurs="0" code="PN"> 
</xs:element> 
<xs:element name="TestItem" type="xs:string" minOccurs="0" code="TA"> 
</xs:element> 

どのように可能性がありこれはXSLTで行われますか?あるいは、XSLTよりも優れた(読んだほうが簡単な)方法がありますか?

結果のXSDはXSD.EXEと共に使用され、シリアライズおよびデシリアライズの目的でC#クラスが作成されます。 XSD.EXEはすべての注釈要素を削除するため、元のXSDをこの方法で使用することはできません。したがって、これらの注釈に含まれる情報は失われます。

答えて

2

これは私がそれを行うだろうかです:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="*[xs:annotation]"> 
    <xsl:copy> 
     <xsl:attribute name="code"><xsl:value-of select="xs:annotation/xs:documentation"/></xsl:attribute> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy>  
    </xsl:template> 

    <xsl:template match="xs:annotation"/>  

</xsl:stylesheet> 
+0

ありがとうございます。今、元のXSDに対して実行する方法を理解するだけです。 :Pあなたが推測したように、XSLTの目的は何であるか分かりませんが、XSLTの経験はありません。私ははるかに啓発されている偉大なXSLTの達人に嘆きます。 –

+0

@RobertHarvey - 私は確かに指導者ではありませんが、私は助けることができてうれしいです。 @ –

+1

@ - なぜdownvote? –

0

これだけ別の答え:)実際

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="node()[local-name()='element']"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()[local-name()!='annotation']"/> 
     <xsl:for-each select="node()[local-name()='annotation']/node()[local-name()='documentation']"> 
     <xsl:attribute name="code"> 
      <xsl:value-of select="."/> 
     </xsl:attribute> 
     </xsl:for-each> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

ノードを再配置するのではなく、それを行うためのXSLTを使用して、非常に良い考え手動で私はいつもXSLTを利用しています。
XSDが許容できるサイズであれば、サンプルXMLを生成するためにも使用できます:)

+1

私はいくつかのグローバル型を持つ1つのXSDに対してあなたのXSLTを試してみることをお勧めします。 SOの[ここ](http://stackoverflow.com/questions/10043414/how-to-define-a-specific-number-in-xsd)に投稿されたような単純なものです。少なくともあなたは@ DevNullのものと比べて、あなたのことがうまくいかないことがわかります...なぜ私があなたの理由を理解できるようにします。そしてあなたの投稿を更新することができます。 –

+0

@PetruGardea、それはOPの質問のために働く..もし要素が複雑な型を定義していれば、私のコードはうまくいきません。それは ''の中のすべての要素ノードを無視しているからです。彼らはcomplextype elseをどこで定義し、それを動作させるべきElementの型として使用します。 –

+0

@PetruGardea、私はあなたの言葉を例にして動作させるために、私の答えをすぐに更新します。 –

関連する問題