2009-10-01 10 views
7

को संरक्षित करने के लिए मैं एक दस्तावेज़ को दूसरे दस्तावेज़ में कनवर्ट करने की कोशिश कर रहा हूं, सीडीएटीए को बिल्कुल पहले दस्तावेज़ में छोड़कर, लेकिन मुझे पता नहीं चला कि कैसे एक्सएसएलटी के साथ सीडीएटीए को संरक्षित करने के लिए।एक्सएसएलटी के साथ एक्सएमएल ट्रांसफॉर्म करें और सीडीएटीए (रूबी में)

प्रारंभिक एक्सएमएल:

<node> 
    <subNode> 
     <![CDATA[ HI THERE ]]> 
    </subNode> 
    <subNode> 
     <![CDATA[ SOME TEXT ]]> 
    </subNode> 
</node> 

अंतिम एक्सएमएल:

<newDoc> 
    <data> 
     <text> 
      <![CDATA[ HI THERE ]]> 
     </text> 
     <text> 
      <![CDATA[ SOME TEXT ]]> 
     </text> 
    </data> 
</newDoc> 

मैं कुछ इस तरह की कोशिश की है, लेकिन कोई किस्मत, सब कुछ गड़बड़ हो जाता है:

<xsl:element name="subNode"> 
    <xsl:value-of select="." disable-output-escaping="yes"/> 
</xsl:element> 

कोई भी विचार कैसे सीडीएटीए को संरक्षित करने के लिए?

धन्यवाद! लांस

का उपयोग गहरे लाल रंग का/nokogiri

अद्यतन: यहाँ कुछ है कि काम करता है।

<text disable-output-escaping="yes">&lt;![CDATA[</text> 
<value-of select="normalize-space(text())" disable-output-escaping="yes"/> 
<text disable-output-escaping="yes">]]&gt;</text> 

कि CDATA, जो मैं क्या जरूरत के लिए काम करता है के सभी पाठ() नोड्स लपेटो जाएगा, और यह पाठ के अंदर html टैग भी सुरक्षित रहेंगे।

उत्तर

5

यदि आप सादा पाठ नोड्स के साथ मिश्रित होते हैं तो आप सीडीएटीए नोड्स के सटीक अनुक्रम को संरक्षित नहीं कर सकते हैं। पर सबसे अच्छा, आप एक विशेष तत्व की सभी सामग्री उत्पादन में CDATA होने के लिए, उस तत्व नाम को सूचीबद्ध करके xsl:output/@cdata-section-elements में मजबूर कर सकते हैं:

<xsl:output cdata-section-elements="text"/> 
+0

क्या मुझे बस xslt, या उन पंक्तियों के साथ कुछ करने से पहले रूबी का उपयोग करना चाहिए और शायद नियमित रूप से अभिव्यक्ति करना चाहिए? आप और कैसे करेंगे? Cdata-section-elements काफी कटौती नहीं कर रहा है क्योंकि मैं चर और ऐसे का उपयोग कर रहा हूं। टिप के लिए धन्यवाद। –

+0

यदि आपको बिल्कुल सीडीएटीए की आवश्यकता है, तो आपको एक्सएसएलटी के अलावा कुछ और देखना होगा। उस ने कहा, मैं इस कारण के लिए बहुत उत्सुक हूं कि आपको इसकी आवश्यकता क्यों है। एक्सडीएम टेक्स्ट और सीडीएटीए के बीच बहुत अच्छे कारण के लिए अंतर नहीं करता है - कोई भी एक्सएमएल-प्रोसेसिंग एप्लिकेशन कभी उनके लिए अलग-अलग अर्थशास्त्र नहीं देना चाहिए, इसलिए सीडीएटीए और कैरेक्टर-एस्केपिंग का उपयोग एक दूसरे के लिए किया जा सकता है। –

+0

मैं फ्लैश में इस डेटा का उपयोग कर रहा हूं, और मैंने सुना है कि सीडीएटीए/सीडीएटीए के साथ बहुत सारी समस्याएं हैं। मैंने वास्तव में अभी तक कोशिश नहीं की है: पी –

3

मेरे अपने प्रश्न का उत्तर पोस्ट करने के लिए क्षमा करें, लेकिन मैं कुछ है कि काम करता है पाया :


<text disable-output-escaping="yes">&lt;![CDATA[</text> <value-of select="normalize-space(text())" disable-output-escaping="yes"/> <text disable-output-escaping="yes">]]&gt;</text> 

कि सभी पाठ() CDATA में नोड्स, जो मैं क्या जरूरत के लिए काम करता लपेटो जाएगा, और यह पाठ के अंदर html टैग भी सुरक्षित रहेंगे।

+0

मुझे लगता है कि यह विशेष रूप से आउटपुट में सीडीएटीए नोड प्राप्त करने का एक तरीका है (सिवाय इसके कि आप '] प्राप्त कर सकते हैं]>' इनपुट 'टेक्स्ट() 'में, इस मामले में यह नहीं होगा काफी कुछ करें जो आप उम्मीद करते हैं), लेकिन मुझे नहीं लगता कि इससे आपको सीडीएटीए नोड्स को पहले स्थान पर कैसे रखा जाएगा, क्योंकि आपके पास अभी भी इनपुट सीडीएटीए नोड्स से इनपुट टेक्स्ट नोड्स को अलग करने का कोई तरीका नहीं है। अन्यथा, मैं नहीं देखता कि यह कैसे 'cdata-section-elements' से अलग है ... –