2008-09-15 14 views
8

निम्न XML को देखते हुए:मैच सशर्त पर वर्तमान नोड मूल्य

<current> 
    <login_name>jd</login_name> 
</current> 
<people> 
    <person> 
    <first>John</first> 
    <last>Doe</last> 
    <login_name>jd</login_name> 
    </preson> 
    <person> 
    <first>Pierre</first> 
    <last>Spring</last> 
    <login_name>ps</login_name> 
    </preson> 
</people> 

मैं कैसे वर्तमान/लॉगिन मिलान के भीतर से "जॉन डो" मिल सकता है?

<xsl:template match="current/login_name"> 
    <xsl:value-of select="../people/first[login_name = .]"/> 
    <xsl:text> </xsl:text> 
    <xsl:value-of select="../people/last[login_name = .]"/> 
</xsl:template> 

उत्तर

10

मैं सूचकांक के लिए एक महत्वपूर्ण लोगों निर्धारित करेंगे:

<xsl:key name="people" match="person" use="login_name" /> 

यहाँ एक कुंजी का उपयोग करना बस कोड को साफ रखता है, लेकिन आप भी यह क्षमता है, तो आप अक्सर पुनः प्राप्त करने में समस्या हो रही के लिए उपयोगी हो सकती है <person> तत्व <login_name> बच्चे के आधार पर तत्व।

मुझे लगता है कि किसी दिए गए <person> की स्वरूपित नाम लौटे एक टेम्पलेट होगा:

<xsl:template match="person" mode="name"> 
    <xsl:value-of select="concat(first, ' ', last)" /> 
</xsl:template> 

और फिर मैं करना चाहते हैं:

<xsl:template match="current/login_name"> 
    <xsl:apply-templates select="key('people', .)" mode="name" /> 
</xsl:template> 
+0

ठीक है, मेरे उत्तर को और नीचे अनदेखा करें, यह एक महान है।साफ और अच्छे पुन: प्रयोज्य भागों से बना है। –

+0

मुझे यह पसंद है! धन्यवाद ... xsl के बारे में कभी नहीं सुना: पहले कुंजी ... –

0

मुझे लगता है कि वह वास्तव में चाहता था व्यक्ति नोड में एक मैच "वर्तमान" नोड के लिए मैच में प्रतिस्थापन, नहीं था:

<xsl:variable name="login" select="//current/login_name/text()"/> 

<xsl:template match="current/login_name"> 
<xsl:value-of select='concat(../../people/person[login_name=$login]/first," ", ../../people/person[login_name=$login]/last)'/> 

</xsl:template> 
4

मैं निम्नलिखित की कोशिश की आप current() समारोह

<xsl:template match="current/login_name"> 
    <xsl:value-of select="../../people/person[login_name = current()]/first"/> 
    <xsl:text> </xsl:text> 
    <xsl:value-of select="../../people/person[login_name = current()]/last"/> 
</xsl:template> 

या थोड़ा अधिक क्लीनर हैं:

<xsl:template match="current/login_name"> 
    <xsl:for-each select="../../people/person[login_name = current()]"> 
    <xsl:value-of select="first"/> 
    <xsl:text> </xsl:text> 
    <xsl:value-of select="last"/> 
    </xsl:for-each> 
</xsl:template> 
+0

THX (रूट नोड, आदि) के साथ पता था दिया जा सकता साथ समाप्त होता है ... यहां तक ​​कि अगर मैं वास्तव में xslt में प्रत्येक के उपयोग को नापसंद करता हूं ... –

0

बस ढेर

<xsl:template match="login_name[parent::current]"> 
<xsl:variable name="login" select="text()"/> 
<xsl:value-of select='concat(ancestor::people/child::person[login_name=$login]/child::first/text()," ",ancestor::people/child::person[login_name=$login]/child::last/text())'/> 
</xsl:template> 

मैं हमेशा स्पष्ट रूप से मेरी XPath, अधिक वर्बोज़ लेकिन स्पष्ट IMHO में कुल्हाड़ियों का उपयोग करना पसंद करने के लिए अपने विचारों को जोड़ने के लिए।

शेष एक्सएमएल दस्तावेज़ कैसे दिखते हैं (यह मानते हुए कि यह केवल एक टुकड़ा है) के आधार पर आपको "पूर्वज :: लोगों" के संदर्भ को बाध्य करने की आवश्यकता हो सकती है उदाहरण के लिए "पूर्वज :: लोग [1]" पहले लोगों के पूर्वजों के लिए।

1

आप एकाधिक उपयोगकर्ताओं का उपयोग करने की जरूरत है, तो JeniT's <xsl:key /> approach आदर्श है।

<xsl:template match="current/login_name"> 
    <xsl:variable name="person" select="//people/person[login_name = .]" /> 
    <xsl:value-of select="concat($person/first, ' ', $person/last)" /> 
</xsl:template> 

हम एक चर के लिए चुना <person> नोड दें और इसके बाद हम नाम/उपनाम उत्पादन के लिए concat() समारोह का उपयोग करें:

यहाँ मेरी विकल्प उस पर लेते हैं।

आपके उदाहरण XML में भी एक त्रुटि है। <person> नोड को गलत ढंग से </preson> (टाइपो)

एक बेहतर हल अगर हम XML दस्तावेज़ की समग्र संरचना वर्तमान टिप के लिए

+0

टिप के लिए धन्यवाद ... बहुत अच्छा काम करता है ... मुझे नहीं पता क्यों, मैं xslt में चर का उपयोग करके नापसंद करता हूं ... –

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