2009-02-10 4 views
26

चलो कहते हैं कि मैं इस तरह एक XML दस्तावेज़ करते हैं:प्रत्येक परीक्षण के लिए एक्सएसएल में वर्तमान नोड मान का संदर्भ कैसे लें?

<books> 
    <book>1110</book> 
    <book>1111</book> 
    <book>1112</book> 
    <book>1113</book> 
</books> 

मैं सेटअप करने के लिए एक शर्त है कि for-each में वर्तमान नोड के मूल्य का परीक्षण करती है कोशिश कर रहा हूँ, लेकिन मैं कुछ गलत कर रहा हूँ:

<xsl:for-each select="/books/book"> 
    <xsl:if test=".[='1112']"> 
     Success 
    </xsl:if> 
</xsl:for-each> 

मैं गलत तरीके से क्या कर रहा हूं?

+0

साथ प्रयास करें। [SomeBoolean] XPath 1.0 में वाक्य रचना अमान्य है। –

उत्तर

37

. का उपयोग करके, वास्तव में, वर्तमान (या "संदर्भ") नोड का संदर्भ ले सकता है, लेकिन जिस तरह से आप इसका उपयोग नहीं कर रहे हैं। XPath में, .[foo] मान्य वाक्यविन्यास नहीं है - आपको इसके बजाय self::node()[foo] का उपयोग करने की आवश्यकता है। इसके अलावा, = ऑपरेटर कुछ, के खिलाफ मैच के लिए इस मामले में text() चयनकर्ता तत्व का पाठ सामग्री का उपयोग करने की जरूरत है:

<xsl:for-each select="/books/book"> 
    <xsl:if test="self::node()[text()='1112']"> 
     Success 
    </xsl:if> 
</xsl:for-each> 

के रूप में, अन्य उत्तर में कहा गया है लेकिन, साथ ही जब तक आपके for-each अन्य कार्यों प्रदर्शन कर रहा है, के लिए-प्रत्येक सबसे निश्चित रूप से गलत सामान्य दृष्टिकोण है का उपयोग करते हुए, बेन सही ढंग से अपने प्रश्न का उत्तर है, वहीं

<xsl:if test="/books/book[. = 1112]"> 
    Success 
</xsl:if> 
3

: आप बिल्कुल पुनरावृति की जरूरत नहीं है और बस if एक ही कार्य को पूरा करने के लिए उपयोग कर सकते हैं। यह सब एक्सएसएलटी है। तो आप शायद अधिक कुछ इस तरह की तलाश में हैं:

<xsl:if test="/books/book[text()='1112']"> 
    Success 
</xsl:if> 
+0

सच; मैंने माना कि ओपी सिर्फ 'प्रत्येक' ब्लॉक के लिए बड़े हिस्से के प्रासंगिक हिस्से को छीन रहा था, लेकिन अगर इसकी पूरी बात है, तो इसके बजाय इस सरल 'if' का उपयोग करना बेहतर होगा। –

12

मैं एक शर्त सेटअप करने के लिए कोशिश कर रहा हूँ कि के लिए-प्रत्येक में वर्तमान नोड के मूल्य का परीक्षण करती है, लेकिन मैं कुछ कर रहा हूँ गलत:

.[='1112'] 
01:

पहली बात यह है कि वह सही नहीं है वाक्य रचना है

वहाँ दो बात बिगड़ यहाँ हैं:

  1. के भीतर [और] कोई विधेय है: "=" ऑपरेटर दो तर्क की जरूरत है, लेकिन केवल एक प्रदान की जाती है।

  2. .[x = y] अभी भी अमान्य वाक्यविन्यास है, हालांकि भविष्य ठीक है

    स्वयं :: नोड() [हालत]

प्रदान की कोड में दूसरी बात कि सुधार किया जा सकता <xsl:for-each> अनुदेश है, जो isn ': यह रूप में निर्दिष्ट किया गया है बिल्कुल जरूरी नहीं है; एक एकल XPath अभिव्यक्ति पर्याप्त होगी।

, एक संभव XPath अभिव्यक्ति है कि आवश्यक बूलियन मान का मूल्यांकन संक्षेप में प्रस्तुत करना है:

/books/book[. = '1112'] 

यदि यह वास्तव में जरूरी है कि हालत <xsl:for-each> अनुदेश के अंदर का परीक्षण किया जा रहा है, तो एक ही सही XPath अभिव्यक्ति मैं का प्रयोग करेंगे है:

. = '1112' 

ऊपर एक str है आईएनजी तुलना और true() का मूल्यांकन नहीं कर सकता है यदि आसपास के स्थान हैं। इसलिए, एक संख्यात्मक तुलना बेहतर हो सकता है:

. = 1112 
+1

अभिव्यक्ति '। = '1112' ने मेरे लिए ठीक काम किया। धन्यवाद। –

+0

@ होसम एली, आपका स्वागत है। –

1

इस

<xsl:for-each select="/books/book"> 
    <xsl:if test="current() = '1112'"> 
     Success 
    </xsl:if> 
</xsl:for-each> 
संबंधित मुद्दे