2011-11-10 17 views
6

में मूल्यों पर आधारित सूची इस एक्सएमएलफ़िल्टर XPath जुड़े सूची

<DiagList> 
    <Diag id="1" icd="400"/> 
    <Diag id="2" icd="401"/> 
    <Diag id="3" icd="402"/> 
    <Diag id="4" icd="400"/> 
</DiagList> 
<ICDList> 
    <ICD id="400" description="First one"/> 
    <ICD id="401" description="Second one"/> 
    <icd id="402" description="Third one"/> 
<ICDList> 

मैं एक XPath क्वेरी कि Diags का चयन करेंगे जहां जुड़े आईसीडी के विवरण कुछ पाठ शामिल लिखना चाहते हैं को देखते हुए।

तो उदाहरण के लिए यदि मैंने "सेंट" का टेक्स्ट निर्दिष्ट किया है तो मुझे डायग्स "1" और "4" प्राप्त करना चाहिए। अगर मैं "आईआर" का पाठ निर्दिष्ट करता हूं तो मुझे डायग्स "1", "3" और "4" प्राप्त करना चाहिए।

मैं

/DiagList/Diag[contains(lcase(/ICDList/ICD[@id=/DiagList/Diag/@icd]/@description), 'st')] 

और बदलाव की कोशिश की।

मैं इसे काम करने में सक्षम नहीं हूं। ऐसा लगता है कि यह @icd के नेस्टेड संदर्भ पसंद नहीं है।

क्या यह कुछ संभव है?

धन्यवाद बेन

+0

हम्म। क्या होगा यदि आपने "एक" लिखा है? तो आप 1,2,3,4 चाहते हैं? – FailedDev

+0

उत्कृष्ट सवाल, +1। XPath हमें एक सुरुचिपूर्ण, एकल अभिव्यक्ति लिखने की संभावना देता है जो वांछित नोड्स का चयन करता है। कोई मजेदार एक्सटेंशन फ़ंक्शन या एक्सएसएलटी-केवल-फ़ंक्शंस आवश्यक नहीं है। –

उत्तर

-1

क्या आप याद कर रहे हैं current() की अवधारणा है। यह फ़ंक्शन पूरे xpath अभिव्यक्ति के लिए संदर्भ नोड का संदर्भ देता है, . के विपरीत, जो xpath अभिव्यक्ति के भीतर वर्तमान नोड का संदर्भ देता है।

तो तुम इस्तेमाल कर सकते हैं:

/DiagList/Diag[contains(lcase(/ICDList/ICD[@id=current()/@icd]/@description), 'st')] 
+0

@_Mike Sokolov: यह एक XPath प्रश्न है, लेकिन आपका उत्तर एक एक्सएसएलटी-केवल समाधान प्रदान करता है ... –

+0

धन्यवाद। यह मेरे पर्यावरण (Altio फ्रंट एंड) में काम नहीं किया।मुझे पिछली छोर पर कुछ और समझना पड़ सकता है। –

2

उपयोग:

/*/DiagList 
     /* 
      [@icd 
      = 
      /*/ICDList/* 
       [contains(@description, $pText)] 
        /@id 
      ] 

जहां $pText वांछित स्ट्रिंग शाब्दिक के साथ प्रतिस्थापित किया जाना चाहिए।

XSLT - आधारित सत्यापन:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my "> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:param name="pText" select="'ir'"/> 

<xsl:template match="/"> 
    <xsl:copy-of select= 
    "/*/DiagList 
     /* 
      [@icd 
      = 
      /*/ICDList/* 
       [contains(@description, $pText)] 
        /@id 
      ]"/> 
</xsl:template> 
</xsl:stylesheet> 

जब इस बदलाव प्रदान की XML दस्तावेज़ पर लागू किया जाता है (अच्छी तरह से गठित Mede बनाने, संशोधित करने):

<t> 
    <DiagList> 
     <Diag id="1" icd="400"/> 
     <Diag id="2" icd="401"/> 
     <Diag id="3" icd="402"/> 
     <Diag id="4" icd="400"/> 
    </DiagList> 
    <ICDList> 
     <ICD id="400" description="First one"/> 
     <ICD id="401" description="Second one"/> 
     <icd id="402" description="Third one"/> 
    </ICDList> 
</t> 

चाहता था नोड्स का चयन किया जाता है और आउटपुट:

पर कॉपी किया गया है
<Diag id="1" icd="400" /> 
<Diag id="3" icd="402" /> 
<Diag id="4" icd="400" /> 

जब हम ऊपर परिवर्तन में सेट:

<xsl:param name="pText" select="'st'"/> 

उसके बाद फिर से वांछित परिणाम का उत्पादन किया है:

<Diag id="1" icd="400" /> 
<Diag id="4" icd="400" /> 
+0

आप प्रतिलिपि के बिना ऐसा कैसे करेंगे? और टेम्पलेट मैच? एक ही एक्सपैथ अभिव्यक्ति का उपयोग करके आप एक ही पंक्ति में एक ही मान को कैसे प्रिंट कर सकते हैं? – FailedDev

+0

@ फ़ेलडेव: मैं आपके प्रश्नों से थोड़ा उलझन में हूं: 1. यह एक एक्सएसएलटी सवाल नहीं है, लेकिन आपकी टिप्पणी में प्रश्न XSLT के बारे में हैं। 2. आप प्रिंटिंग मूल्यों के बारे में क्यों पूछ रहे हैं? प्रश्न * चयन * नोड्स के बारे में है। 3. केवल एक पंक्ति पर क्यों? 4. क्या आपका मतलब है कि परिणाम एक पंक्ति पर होना चाहिए, या XPath अभिव्यक्ति एक पंक्ति पर होनी चाहिए? यदि यह XPath अभिव्यक्ति को संदर्भित करता है, तो मैंने इसे केवल पठनीयता के लिए कई पंक्तियों पर लिखा है - यदि आवश्यक हो तो इसे आसानी से एक पंक्ति पर लिखा जा सकता है। –

+0

मेरा प्रश्न यह है कि एक और उपयोगिता का उपयोग करते समय, आप एक ही परिणाम कैसे करेंगे, उदा। jquery या php और xpath का उपयोग उसी परिणाम के लिए करें जो आप अपने परिणाम पर प्रिंट करते हैं। – FailedDev

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