2012-09-13 17 views
20

मैं XSLT में एकल उद्धरण के साथ डेटा सबस्ट्रिंग करने की कोशिश की बचने के लिए:कैसे xslt सबस्ट्रिंग समारोह में एकल उद्धरण

String : DataFromXML:'12345' 

उम्मीद परिणाम: 12345

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:')"/> 

परिणाम: '12345'

मैं करने की कोशिश की कोड

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:&#39;')"/> 

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:&apos;')"/> 

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:'')"/> 

त्रुटि:

String literal was not closed 'DataFromXML:'--->'<--- 
+0

क्या आपने डबल कोट्स "'" का प्रयास किया था? – Vitaliy

+0

हाँ मैंने कोशिश की है कि यह संकलन त्रुटि प्राप्त हो रहा है – buttowski

+0

@ प्रभु, यह * एक जटिल एक्सपीएथ 1.0 अभिव्यक्ति के साथ संख्या को निकालने के लिए संभव है, यहां तक ​​कि सबसे जटिल मामले में जब स्ट्रिंग में उद्धरण और apostrophes दोनों शामिल हैं - किसी भी चर का उपयोग नहीं कर रहा है । –

उत्तर

20

बचने के लिए सामान्य नियम हैं:

1.0 में:

  • आप एक स्ट्रिंग में विशेषता सीमांकक शाब्दिक चाहते हैं, एक्सएमएल भागने रूप &quot; या &apos;
  • अगर आप चाहते हैं का उपयोग करें एक स्ट्रिंग शाब्दिक में स्ट्रिंग डेलीमीटर, आप

2.0 में:

  • यदि आप एक स्ट्रिंग शाब्दिक में विशेषता सीमांकक चाहते हैं, एक्सएमएल भागने रूप &quot; या &apos;
  • अगर आप चाहते हैं एक स्ट्रिंग में स्ट्रिंग सीमांकक शाब्दिक उपयोग करते हैं, यह दोगुना ( उदाहरण के लिए 'मैं कर सकते हैं 'टी')

Vitaliy द्वारा दिखाए गए एक परिवर्तनीय $ quot या $ apos का उपयोग कोड को अधिक स्पष्ट बना सकता है।

+3

माइकल, वास्तव में सबसे जटिल मामले में एक एक्सपीएथ 1.0 अभिव्यक्ति के साथ संख्या को निकालना संभव है जब स्ट्रिंग में उद्धरण और apostrophes दोनों शामिल हैं - किसी भी चर का उपयोग नहीं करते हैं। –

+2

संभावित, हां, लेकिन केवल इकाई संदर्भों का इतना भारी उपयोग करके कि कोड पूरी तरह से अपठनीय हो जाता है। और वैसे भी चर इतने खराब क्यों हैं? - एक अच्छा प्रोसेसर उन्हें रेखांकित करेगा। –

+5

मेरे पास चर का उपयोग करने के खिलाफ कुछ भी नहीं है - बस अपने कथन को संबोधित किया है कि "यदि आप एक स्ट्रिंग अक्षर में स्ट्रिंग डेलीमीटर चाहते हैं, तो आप को रोक दिया गया है"। सटीक होने की कोशिश करने के लिए खेद है। –

10

यह काम करना चाहिए:

<xsl:variable name="apos">'</xsl:variable> 

... 

<xsl:value-of select="substring-before(substring-after($datafromxml, concat('DataFromXML:', $apos)), $apos)" /> 
+0

हाँ .. यह धन्यवाद काम करता है .... – buttowski

+0

XPath 1.0 नियमों के बारे में निश्चित नहीं है - शायद यह विशेष चर – Vitaliy

+1

के बिना एक आसान समाधान भी हो सकता है जो मैंने देखा है सबसे अच्छा कामकाज। धन्यवाद। –

7

आप की अदला-बदली की कोशिश कर सकते हैं और 'और' अपने XSL में: मूल्य के

<xsl:value-of select='substring-before 
    (substring-after($datafromxml,"DataFromXML:&apos;"), "&apos;")'/> 

वैकल्पिक रूप से, आप कर सकते थे अजीब apostrophes

को हटाने के लिए अनुवाद समारोह का उपयोग करें
<xsl:value-of select='translate 
    (substring-after($datafromxml,"DataFromXML:"), "&apos;", "")'/> 

आवश्यक नहीं है, लेकिन यह एक चर के लिए आवश्यकता को हटा देता है।

4

यहां तक ​​कि सबसे जटिल मामले में - स्ट्रिंग में एक उद्धरण और एक एस्ट्रोफ़े दोनों होता है - संख्या को चर के बिना निकाला जा सकता है।

मान लीजिए हम इस XML दस्तावेज़ है:

<t>' "12345' "</t> 

और बस संख्या extruct करना चाहते हैं।

निम्नलिखित परिवर्तन में हम एक भी XPath अभिव्यक्ति का उपयोग वास्तव में ऐसा करने के लिए:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="text()"> 
    <xsl:value-of select= 
    'substring-after(.,"&apos;") 
    '/> 
============== 
    <xsl:value-of select= 
    'substring-before(
     substring-after(substring-after(.,"&apos;"), &apos;&quot;&apos;), 
     "&apos;" 
         ) 
    '/> 
</xsl:template> 
</xsl:stylesheet> 

परिणाम है:

"12345' " 
============== 
    12345 

ध्यान दें करो: मैं जानबूझकर कर रहा हूँ दो XPath एक्सप्रेशन - पहले का उद्देश्य यह समझना आसान है कि दूसरे XPath एक्सप्रे में क्या व्यक्त किया गया है ssion। टेम्पलेट बॉडी में केवल अंतिम xsl:value-of छोड़कर बिल्कुल वांछित परिणाम उत्पन्न होता है:

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