2012-05-24 10 views
8

मेरे पास कई बड़ी डीटीडी फ़ाइलें हैं। मैंने एक्सएसडी फाइलों में कनवर्ट करने के लिए trang का उपयोग किया है, इसलिए मैं इसे आसानी से जेएक्सबी और अन्य उपयोगिताओं से उपयोग कर सकता हूं। हालांकि, जेनरेट की गई एक्सएसडी फ़ाइल में शीर्ष स्तर पर सभी घोषित तत्व हैं। इसका मतलब है कि कोई तत्व इनपुट एक्सएमएल का मूल तत्व हो सकता है। मैं केवल एक विशेष तत्व निर्दिष्ट करना चाहता हूं।परिभाषित रूट (प्रारंभ) तत्व के साथ डीटीडी से एक्सएसडी में कनवर्ट करें

इन एकाधिक रूट तत्वों को होने से कुछ समस्याएं होती हैं, उदा। xjc सभी कक्षाओं के लिए @XmlRootElement उत्पन्न करता है, इसलिए मुझे और अतिरिक्त चेक जोड़ने की आवश्यकता है।

मैं समझता हूँ के रूप में, मैं अगर सब कर सत्यापित करने के लिए element type रों में, <xs:complexType> रों करने के लिए उत्पन्न XSD पुनर्लेखन, चलती <xs:element> रों बदलते element ref रों और इतने पर करने की जरूरत है, लेकिन यह बहुत ज्यादा बंदर काम हो सकता है, कोई रास्ता नहीं के साथ सही ढंग से।

क्या ऐसा करने के लिए एक और अधिक प्रभावी तरीका है?

+0

एक सवाल है कि समझ में आता है के लिए +1, लेकिन यह भी साफ किया DTD XSD करने के लिए रूपांतरण हमेशा केवल अनुमानित है कि बनाते हैं। –

+0

@ जिर्काहनिका जैसा कि मैं समझता हूं कि उत्पन्न एक्सएसडी एक डीटीडी का अनुमान लगाता है। शायद DOCTYPE परिभाषाओं (हालांकि कोई आश्चर्य नहीं) और कुछ नामस्थान सामान को छोड़कर। इसके अलावा कुछ अजीब डीटीडी संरचनाओं को अच्छी तरह से एक्सएसडी में परिवर्तित नहीं किया जा सका। इस समय मुझे एकमात्र समस्या का सामना करना पड़ रहा है, कि डीटीडी रूट तत्व की धारणा को परिभाषित नहीं करता है। (RelaxNG इसे '' के साथ परिभाषित करता है, लेकिन यह खराब रूप से समर्थित है, 'xjc' इसके साथ विफल रहा है)। – kan

+0

हां लेकिन नेमस्पेस सामान एक बड़ी बात है।इसके अतिरिक्त कई संरचनाएं जिन्हें समान नाम दिया गया है, का अर्थ काफी अलग है। पहले जवाब में +1 क्योंकि यह किसी भी एक्सएसडी अर्थशास्त्र का नाटक नहीं करता है। –

उत्तर

0

मैंने जेनरेट एक्सएसडी को संसाधित करने के लिए सरल एक्सएसएलटी ट्रैनफॉर्मेशन का उपयोग किया है। मेरे मामले के लिए ठीक काम करता है:

<?xml version="1.0"?> 

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     > 
    <xsl:template match="@*|node()|comment()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()|comment()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="xs:element/@ref"/> 
    <xsl:template match="xs:element[@ref]"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:attribute name="type"><xsl:value-of select="@ref"/></xsl:attribute> 
      <xsl:attribute name="name"><xsl:value-of select="@ref"/></xsl:attribute> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="xs:element[@name = //xs:element/@ref and xs:complexType]"> 
     <xs:complexType name="{@name}"> 
      <xsl:apply-templates select="xs:complexType/node()"/> 
     </xs:complexType> 
    </xsl:template> 
    <xsl:template match="xs:element[@name = //xs:element/@ref and @type]"> 
     <xsl:choose> 
      <xsl:when test="//xs:complexType[@name = current()/@type]"> 
       <xs:complexType name="{@name}"> 
        <xs:complexContent> 
         <xs:extension base="{@type}"/> 
        </xs:complexContent> 
       </xs:complexType> 
      </xsl:when> 
      <xsl:otherwise> 
       <xs:simpleType name="{@name}"> 
        <xs:restriction base="{@type}"/> 
       </xs:simpleType> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

यह तत्व परिभाषाओं जिक्र किया गया और उन्हें comptexType रों बनाने, refs बदलते पता लगाता है। सभी अव्यवस्थित तत्व प्रारंभ तत्व बन जाते हैं।

0

जो कुछ आप वर्णन कर रहे हैं उससे, और कुछ टिप्पणियों में बताए गए रूपांतरण की "निष्ठा" को अनदेखा करते हुए, मैं केवल इस तथ्य से निपट रहा हूं कि आप बस कुछ स्वचालित तरीके ढूंढ रहे हैं (मैं क्या कॉल) एक्सएमएल स्कीमा रिफैक्टरिंग। मैं QTAssistant से जुड़ा हूं, जो इस तरह के काम के लिए है, इसलिए मैं यह करूँगा ...

एक चीज़ जो आपको हाथ से करना है, इससे कोई फर्क नहीं पड़ता कि क्या पता लगाना और कैप्चर करना है उन तत्वों की सूची जिन्हें आप रूट (या नहीं) के रूप में देखना चाहते हैं ... और आप कर चुके हैं: एक बटन दबाएं, या कमांड लाइन का आह्वान करें, और आप निश्चित रूप से जान लेंगे कि वैध एक्सएसडी उत्पन्न हुआ है या नहीं।

एक रिफैक्टरिंग इंजन एक आगंतुक पैटर्न को नियोजित करता है जो आपके मामले में अनिवार्य रूप से आपको जो चाहिए वह करता है: आवश्यक वैश्विक प्रकार बनाता है, अवांछित वैश्विक तत्व परिभाषाओं को हटा देता है, और इनलाइन घोषणाओं के साथ किसी भी refed तत्वों को प्रतिस्थापित करता है।

(इसे पढ़ने वाले किसी भी व्यक्ति के लिए जो प्रतिस्थापन समूह जानता है, यह रिफैक्टरिंग प्रतिस्थापन समूह के एक प्रमुख के संदर्भ में नहीं है, क्योंकि हम डीटीडी से एक्सएसडी के बारे में बात कर रहे हैं, यह कोई समस्या नहीं है)।

यह सादगी, और तथ्य जो दोहराने योग्य और भरोसेमंद है, एक विशेष रिफैक्टरिंग टूल का उपयोग करने के मुख्य फायदे होंगे; एक अन्य लाभ: यह xml नेमस्पेस को फिर से असाइन कर सकता है, वैसे भी आप चाहते हैं ...

यदि आप अधिक जानकारी में रुचि रखते हैं, तो मुझे बताएं और मैं इस पोस्ट को एक छोटे से नमूने और कुछ चित्रों के साथ अपडेट करूंगा।

संबंधित मुद्दे