2009-10-26 9 views
6

मान लें कि मैं एक बहुविकल्पीय क्विज़ को एक मनमानी एक्सएमएल प्रारूप से एचटीएमएल में बदल रहा हूं। प्रत्येक विकल्प को परिणाम दस्तावेज़ में HTML <li> टैग के रूप में दर्शाया जाएगा। प्रत्येक विकल्प के लिए, मैं correct के <li> पर एक HTML class जोड़ना चाहता हूं, यदि वह विकल्प सही उत्तर था। इसके अतिरिक्त, यदि वह विकल्प उपयोगकर्ता द्वारा चुना गया था, तो मैं submitted की कक्षा <li> में जोड़ना चाहता हूं। नतीजतन, यदि पसंद सही है साथ ही सबमिट किए गए एक, <li> में correct submitted होना चाहिए।क्या एक्सएसएलटी के साथ कई HTML कक्षाएं जोड़ने का एक शानदार तरीका है?

जहां तक ​​मुझे पता है, सफेद-स्थान से अलग विशेषता मान XML डेटा मॉडल का हिस्सा नहीं हैं और इस प्रकार सीधे एक्सएसएलटी के माध्यम से नहीं बनाए जा सकते हैं। हालांकि, मुझे लगता है कि वर्गों के हर संभव संयोजन के लिए एक सशर्त के साथ कोड को कूड़ेदान करने से बेहतर करने का एक बेहतर तरीका है (जो इस उदाहरण में स्वीकार्य होगा, लेकिन अधिक जटिल परिदृश्यों में अनावश्यक)।

मैं इसे एक सुरुचिपूर्ण तरीके से कैसे हल कर सकता हूं?

वांछित परिणाम का उदाहरण:

<p>Who trained Obi-Wan Kenobi?</p> 
<ul> 
    <li>Mace Windu</li> 
    <li class="correct submitted">Qui-Gon Jinn</li> 
    <li>Ki-Adi-Mundi</li> 
    <li>Yaddle</li> 
</ul> 

उत्तर

9

सबसे पहले, वहाँ XML में विशेषता मान में सफेद स्थान के साथ कुछ भी गलत नहीं है: मोटे तौर पर कहा जाए तो attribute value normalization रिक्त स्थान के लिए खाली स्थान के पात्रों धर्मान्तरित और एक भी अंतरिक्ष जब एक दस्तावेज पार्स किया गया है करने के लिए आसन्न रिक्त स्थान गिर, लेकिन खाली स्थान के निश्चित रूप से अनुमति दी है। संपादित करें: इस पर और अधिक के लिए नीचे देखें।

मैथ्यू विल्सन का दृष्टिकोण संभावित मूल्यों के बीच व्हाइटस्पेस को शामिल करने में विफल रहता है, जैसा कि आपने अपनी टिप्पणी में उल्लेख किया है। हालांकि, उनका दृष्टिकोण मौलिक रूप से ध्वनि है। जिग्स का अंतिम भाग अनावश्यक रिक्त स्थानों का नापसंद है: इन्हें normalize-space XPath फ़ंक्शन के उपयोग से समाप्त किया जा सकता है।

निम्नलिखित स्टाइलशीट सभी बिट्स को एक साथ रखता है - ध्यान दें कि यह अपने इनपुट दस्तावेज़ के साथ कुछ भी नहीं करता है, इसलिए परीक्षण उद्देश्यों के लिए आप इसे किसी भी XML दस्तावेज़ के विरुद्ध या यहां तक ​​कि अपने खिलाफ भी चला सकते हैं, यह सत्यापित करने के लिए कि आउटपुट पूरा हो आपकी जरुरतें।

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:variable name="foo0" select="false()"/> 
    <xsl:variable name="bar0" select="true()"/> 

    <xsl:variable name="foo1" select="true()"/> 
    <xsl:variable name="bar1" select="false()"/> 

    <xsl:variable name="foo2" select="true()"/> 
    <xsl:variable name="bar2" select="true()"/> 

    <xsl:template match="/"> 

    <xsl:variable name="foobar0"> 
     <xsl:if test="$foo0"> foo</xsl:if> 
     <xsl:if test="$bar0"> bar</xsl:if> 
    </xsl:variable> 

    <xsl:variable name="foobar1"> 
     <xsl:if test="$foo1"> foo</xsl:if> 
     <xsl:if test="$bar1"> bar</xsl:if> 
    </xsl:variable> 

    <xsl:variable name="foobar2"> 
     <xsl:if test="$foo2"> foo</xsl:if> 
     <xsl:if test="$bar2"> bar</xsl:if> 
    </xsl:variable> 

    <li> 
     <xsl:attribute name="class"> 
     <xsl:value-of select="normalize-space($foobar0)"/> 
     </xsl:attribute> 
    </li> 
    <li> 
     <xsl:attribute name="class"> 
     <xsl:value-of select="normalize-space($foobar1)"/> 
     </xsl:attribute> 
    </li> 
    <li> 
     <xsl:attribute name="class"> 
     <xsl:value-of select="normalize-space($foobar2)"/> 
     </xsl:attribute> 
    </li> 

    </xsl:template> 
</xsl:stylesheet> 

संपादित करें: इसके अलावा एक विशेषता के मान के भीतर असतत घटकों को अलग रिक्त स्थान के सवाल पर: एक्सएमएल युक्ति attribute types, IDREFS और NMTOKENS सहित के रूप में संभव वैध निर्माणों की एक संख्या निर्धारित करता है। पहला मामला Names उत्पादन से मेल खाता है, और दूसरा मामला NMTokens उत्पादन से मेल खाता है; इन दोनों प्रस्तुतियों को रिक्त स्थान द्वारा सीमित, उचित प्रकार के कई मानों के रूप में परिभाषित किया गया है।तो मूल्यों की स्पेस-सीमांकित सूचियां एक विशेषता के मान के रूप में एक्सएमएल सूचना सेट का एक निहित घटक हैं।

+0

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

+2

@ जैकोब: मैंने अपने उत्तर के अंत में एकल विशेषता मान बनाने वाले मानों की स्पेस-पृथक सूचियों के बारे में कुछ और विवरण जोड़े हैं। – NickFitz

5

मेरे सिर के ऊपर बंद, तुम एक अंतरिक्ष अलग की गई सूची की तरह कुछ के साथ निर्माण कर सकते हैं:

<li> 
    <xsl:attribute name="class"> 
     <xsl:if cond="...">correct</xsl:if> 
     <xsl:if cond="...">submitted</xsl:if> 
    </xsl:attribute> 
</li> 
+0

यह काम नहीं करता है (कम से कम PHP का उपयोग नहीं कर रहा है)। 'If' तत्वों के आस-पास के अलावा वहां कोई सफेद-स्थान नहीं है, और यह आउटपुट को प्रभावित नहीं करता है (आपको इसके लिए' टेक्स्ट' तत्वों का उपयोग करने की आवश्यकता होगी)। अनुमोदित, मैं इस समाधान का उपयोग कर सकता हूं और प्रत्येक संभव वर्ग के नाम के बाद बस एक जगह जोड़ सकता हूं, लेकिन इससे अनावश्यक रिक्त स्थान निकल जाएंगे और आवश्यकतानुसार अधिक अव्यवस्थित दिखेंगे। – Jakob

+1

मैंने इसे सफलतापूर्वक उपयोग किया है, इसलिए शायद एक्सएसएलटी प्रोसेसर में यह अंतर है कि वे XSLT फ़ाइल में व्हाइटस्पेस के साथ क्या करते हैं। –

+2

'परीक्षण' नहीं होना चाहिए? – Maarten

1

जहां तक ​​मेरा पता है, सफेद-स्थान से अलग विशेषता मान XML डेटा मॉडल का हिस्सा नहीं हैं और इस प्रकार सीधे XSLT

के माध्यम से सीधे नहीं बनाया जा सकता है

जब तक आप किसी XML भाषा में परिवर्तित नहीं हो जाते (जो HTML नहीं है, एक्सएचटीएमएल है), तो आपको एक्सएसएलटी आउटपुट की XML वैधता के बारे में चिंता नहीं करनी चाहिए। यह कुछ भी हो सकता है, और एक्सएमएल के अनुरूप होने की आवश्यकता नहीं है!

+0

मैं यह नहीं कह रहा हूं कि व्हाइटस्पेस से अलग विशेषता मान अमान्य एक्सएमएल हैं, केवल इतना है कि (मेरे ज्ञान के लिए) एक्सएसएलटी संरचनाएं जो उन्हें विशेष रूप से उत्पन्न करती हैं। – Jakob

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

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