2011-05-06 23 views
22

पर एक्सएसएल का उपयोग एक्सएमएल से सरल सादे पाठ आउटपुट उत्पन्न करने के लिए मुझे एक्सएसएल का उपयोग करने की आवश्यकता है। चूंकि मुझे ऑनलाइन कोई अच्छा, संक्षिप्त उदाहरण नहीं मिला, इसलिए मैंने अपना समाधान यहां पोस्ट करने का फैसला किया। किसी भी लिंक के लिए एक बेहतर उदाहरण की चर्चा करते हुए निश्चित रूप से सराहना की जाएगी:एक्सएसएल का उपयोग सादा पाठ

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" > 
    <xsl:output method="text" omit-xml-declaration="yes" indent="no"/> 
    <xsl:template match="/"> 
     <xsl:for-each select="script/command" xml:space="preserve">at -f <xsl:value-of select="username"/> <xsl:value-of select="startTime/@hours"/>:<xsl:value-of select="startTime/@minutes"/> <xsl:value-of select="startDate"/><xsl:text> 
</xsl:text></xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

कुछ महत्वपूर्ण चीजें हैं जो मुझे यहाँ मदद की बाहर:

  1. XSL के उपयोग: उत्पादन मानक घोषणा न करने का विकल्प शुरुआत में आउटपुट दस्तावेज़
  2. xml का उपयोग: स्पेस = "संरक्षित" विशेषता xsl के भीतर लिखा गया किसी भी सफेद स्थान को संरक्षित करने के लिए: प्रत्येक टैग के लिए। यह मुझे एक ही पंक्ति (लाइन ब्रेक के अपवाद के साथ) के साथ-साथ टैग सहित प्रत्येक टैग के लिए सभी कोड लिखने की भी आवश्यकता है।
  3. लाइन ब्रेक डालने का उपयोग - फिर मुझे मानक एक्सएमएल इंडेंटिंग को छोड़ना पड़ा।

जिसके परिणामस्वरूप और इस xslt के लिए वांछित उत्पादन किया गया था:

-f alluser 23:58 17.4.2010
पर -f ggroup67 पर 7:58 28.4.2010
पर -f ggroup70 15: 58 2010/04/18
-f alluser 23:58 18.4.2010
पर -f ggroup61 7:58 22.9.2010
पर -f ggroup60 23:58 21.9.2010
पर -f alluser 3:58 22.9 पर .2010

जैसा कि मैंने कहा, यह और अधिक सुन्दर तरीके से करने के सुझावों की सराहना की जाएगी।


अनुवर्ती 2011-05-08:

<script xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="script.xsd"> 
    <command> 
     <username>alluser</username> 
     <startTime minutes="58" hours="23"/> 
     <startDate>17.4.2010</startDate> 
    </command> 
</script> 
+1

आप 'concat (, उपयोगकर्ता नाम '-f पर', '', STARTTIME/@ घंटे, '', ...)' का उपयोग करके '' तत्वों की संख्या पर बचा सकता है। इसके अलावा, आप अपने स्रोत कोड को लपेट सकते हैं - यदि आप टैग के अंदर ऐसा करते हैं, तो यह आउटपुट को प्रभावित नहीं करेगा। –

+0

अच्छा सवाल, +1। एक पूर्ण, बहुत छोटा और वास्तव में सामान्य समाधान के लिए मेरा उत्तर देखें। –

+0

@ क्रिस्टोफर क्रूटज़िग: कॉन्सैट() पर महान सुझाव के लिए धन्यवाद। आप "अपने स्रोत कोड को लपेटने" के साथ क्या कह रहे हैं? – Chris

उत्तर

21
  • आप एक टेम्पलेट script/command पर से मेल खाते हैं और समाप्त करने के लिए निर्धारित कर सकते हैं:

    यहाँ एक्सएमएल के प्रकार मैं इलाज कर रहा हूँ है xsl:for-each

  • concat() अभिव्यक्ति को कम करने के लिए उपयोग किया जा सकता है और आपकोस्पष्ट रूप से डालने से बचा सकता हैऔर <xsl:value-of> तत्व।
  • कैरिज रिटर्न के लिए एक इकाई संदर्भ &#xA; का उपयोग, आपके <xsl:text> तत्व के बीच लाइन-ब्रेक को संरक्षित करने पर निर्भर होने के बजाय थोड़ा अधिक सुरक्षित है, क्योंकि कोड स्वरूपण आपकी लाइन ब्रेक को गड़बड़ नहीं करेगा। इसके अलावा, मेरे लिए, यह एक स्पष्ट लाइन-ब्रेक के रूप में पढ़ता है और इरादे को समझना आसान है।

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:fo="http://www.w3.org/1999/XSL/Format" > 
    <xsl:output method="text" omit-xml-declaration="yes" indent="no"/> 

    <xsl:template match="script/command"> 
     <xsl:value-of select="concat('at -f ' 
        ,username 
        ,' ' 
        ,startTime/@hours 
        ,':' 
        ,startTime/@minutes 
        ,' ' 
        ,startDate 
        ,'&#xA;')"/> 
    </xsl:template> 

</xsl:stylesheet> 
+0

धन्यवाद मैड्स, उत्कृष्ट सुझाव। यही वह है जिसकी तलाश में मैं हूं। मैं XPath 2 की उपयोगी सुविधाओं के बारे में भूल गया था ... कैसे यह है कि मुझे खिड़कियां, पर एक नई लाइन देता है जब खिड़कियों आमतौर पर न केवल एक लाइन फ़ीड, लेकिन यह भी एक गाड़ी वापसी की आवश्यकता है? – Chris

+1

@ क्रिस डिकिंसन डॉट नोट, यह एक एक्सएसएलटी/एक्सपीएथ 1.0 समाधान है, कोई XPath 2.0 सुविधाओं का उपयोग नहीं किया गया है। ' ' (लाइन फ़ीड) अक्सर पर्याप्त होता है। यदि आपको सीआरएलएफ की आवश्यकता है तो आप ' ' (कैरिज रिटर्न) जोड़ सकते हैं। –

7

बस मस्ती के लिए : यह एक बहुत ही सामान्य और कॉम्पैक्ट रास्ता में किया जा सकता:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="username"> 
     at -f <xsl:apply-templates select="*|@*"/> 
    </xsl:template> 
</xsl:stylesheet> 

जब इस XML दस्तावेज़ पर लागू:

<script> 
<command> 
    <username>John</username> 
    <startTime hours="09:" minutes="33"/> 
    <startDate>05/05/2011</startDate> 

    <username>Kate</username> 
    <startTime hours="09:" minutes="33"/> 
    <startDate>05/05/2011</startDate> 

    <username>Peter</username> 
    <startTime hours="09:" minutes="33"/> 
    <startDate>05/05/2011</startDate> 
</command> 
</script> 

चाहता था, सही परिणाम का उत्पादन किया है:

at -f 09:33 05/05/2011 
    at -f 09:33 05/05/2011 
    at -f 09:33 05/05/2011 

नोट: यह genaral दृष्टिकोण सबसे अच्छा लागू होने पर सभी डेटा होने के लिए उत्पादन पाठ नोड्स में निहित है है - विशेषताओं में नहीं।

+0

@ * मान गुम हैं (और उन्हें ':' द्वारा सीमित किया जाना चाहिए था)। साथ ही, यह सुनिश्चित नहीं है कि आउटपुट में 'at -f' से पहले प्रमुख रिक्त स्थान एक समस्या होगी। –

+0

@ मैड्स हैंनसेन: इसे नोट करने के लिए धन्यवाद। अब तय –

+0

लगभग, लेकिन मुझे नहीं लगता कि स्रोत एक्सएमएल में '@' के मूल्य में ':' है। नमूना एक्सएसएल पोस्ट विशेषता मूल्य से चयन नहीं कर रहा है, स्पष्ट रूप से ':' डाल रहा है। –