2008-12-10 17 views
5

एक स्टाइलशीट के लिए मैं लिख रहा हूं (वास्तव में उनमें से एक सेट के लिए, प्रत्येक एक अलग आउटपुट प्रारूप उत्पन्न करता है), मुझे मूल्यांकन करने की आवश्यकता है कि मूल्यों की सूची में कोई निश्चित मान मौजूद है या नहीं। इस मामले में, परीक्षण किया जा रहा मूल्य तत्व के गुण से लिया जाता है। जिस सूची में इसका परीक्षण किया जाना है, वह स्टाइलशीट के आविष्कार से आता है, और इसे शीर्ष-स्तर <xsl:param> के रूप में लिया जाता है (जब मैं xsltproc या सैक्सन समकक्ष आमंत्रण कहता हूं तो कमांड लाइन पर प्रदान किया जाना चाहिए)। उदाहरण के लिए, इनपुट मूल्य हो सकता है:एलिमेंट-इन-लिस्ट परीक्षण

v0_01,v0_10,v0_99 

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

जो मैं खोज रहा हूं वह पर्ल के grep जैसा कुछ है, जिसमें मैं देख सकता हूं कि वर्तमान में मेरे पास मौजूद मूल्य में मौजूद है या नहीं। यह उप-स्ट्रिंग परीक्षणों के साथ किया जा सकता है, लेकिन यह चालाक होना चाहिए ताकि झूठी-सकारात्मक न हो (v0_01v0_011 वाली स्ट्रिंग से मेल नहीं खाएं)। ऐसा लगता है कि एक्सएसएल/एक्सएसएलटी का समर्थन करने वाला एकमात्र गैर-स्केलर डेटा-प्रकार एक नोड-सेट है। मुझे लगता है कि सूची को टेक्स्ट नोड्स के एक सेट में परिवर्तित करना संभव है, लेकिन यह अतिरिक्त सीमाओं के साथ उप-स्ट्रिंग परीक्षण करने की तुलना में अधिक-हत्या की तरह लगता है-झूठी मैचों को रोकने के लिए जांच।

उत्तर

8

वास्तव में, XPath स्ट्रिंग फ़ंक्शंस का उपयोग करना इसे करने का सही तरीका है।

contains(concat(',' $list, ','), concat(',', $value, ',')) 

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

substring-before(concat('|,' $list, ',|'), concat(',', $value, ',')) 

या

substring-after(concat('|,' $list, ',|'), concat(',', $value, ',')) 

आप परिणाम के रूप में एक खाली स्ट्रिंग मिलता है, $value सूची में नहीं है।

संपादित करें:

@ Dimitre की टिप्पणी सही है: substring-before() (या substring-after()) भी रिक्त स्ट्रिंग लौटाने होता अगर पाया स्ट्रिंग पहले (या पिछले) सूची में है। इससे बचने के लिए, मैंने कुछ को शुरुआत और सूची के अंत में जोड़ा। अभी भी ऐसा करने का अनुशंसित तरीका है।

+0

असल की सूची में शामिल है

        exists(tokenize($list, ',')[. = $value])

true() का आकलन करती है, मेरे प्रयोजनों के लिए, ऐसा लगता है कि "शामिल" फ़ंक्शन करेगा (आपके द्वारा सुझाए गए पैडिंग का उपयोग करके)। मुझे क्या ट्रिप किया गया था, यह था कि मैं एक्सएसएलटी के भीतर ही इस कार्यक्षमता की तलाश कर रहा था, जब मुझे XPath में देखना चाहिए था। – rjray

+0

इसमें शामिल() फ़ंक्शन जोड़ा गया है, जो कि मुझसे बच निकला था। धन्यवाद। :-) – Tomalak

+0

@ टोमालक: सबस्ट्रिंग-पहले() अभिव्यक्ति का मूल्यांकन '' 'होगा, भले ही मूल्य सूची में निहित है (जब यह पहला मान है)। इसी प्रकार, सबस्ट्रिंग-बाद() अभिव्यक्ति "'का मूल्यांकन करती है जब मूल्य सूची में अंतिम होता है। इसलिए, केवल शामिल है() अभिव्यक्ति सही है –

4

XPath 1.0 Tomalak द्वारा प्रदान समाधान के अलावा,

XPath 2 का उपयोग करना।0 एक मानों की सूची tokenize कर सकते हैं: यदि और केवल यदि $value मूल्यों $list

+0

इस तरह लिखना बेहतर नहीं है: टोकननाइज ($ सूची, ',') = $ मूल्य – lagivan

+1

@ लैगिवैन, यह निर्भर करता है कि हम बेहतर तरीके से क्या समझते हैं। मुझे लगता है कि "अस्तित्व" (एक शब्द या अवधारणा के रूप में) का उपयोग करना तुरंत लोगों के लिए अधिक समझदार और प्राकृतिक है, जो XPath के शॉर्टकट्स के आदी नहीं हैं। साथ ही, "मौजूदा()" फ़ंक्शन को सामान्य मान तुलना से बेहतर अनुकूलित किया जा सकता है। –

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