2009-12-05 10 views
7

मैं एक्सएसएल और एक्सपैथ फ़ंक्शंस का उपयोग करने की कोशिश कर रहा हूं ताकि एक्सएमएल एट्रिब्यूट से सभी सफेद स्पेस को नाम दिया जा सके और इसे कम केस बना दिया जा सके। फिलहाल मेरे पाससफेद स्पेस को हटाने के लिए एक्सपैथ फ़ंक्शन

<xsl:variable name="linkName"> 
<xsl:value-of select="normalize-space(name)"/> 
</xsl:variable> 

यह शुरुआत और अंत में सफेद स्थान को हटा देता है लेकिन मध्य में नहीं। कोई सुझाव?

हैंडलिंग और XML डेटा में फेरबदल के रूप में ऐसा लगता है कि आप

<xsl:value-of select="x"/> 

एचटीएमएल

या

<xsl:attribute name="y"> 
<xsl:value-of select="x"/> 

में सीधे रखा का उपयोग करें या एक

उपयोग कर सकते हैं के लिए सबसे अच्छा तरीका क्या है
<xsl:variable name="x"> 

मैं वास्तव में मतभेदों के बारे में निश्चित नहीं हूं या जब प्रत्येक का उपयोग किया जाना चाहिए। किसी भी प्रकार की मदद की बेहद सराहना की जाती है।

सहयोगी

+1

स्पष्टीकरण का एक बिंदु, सामान्यीकृत-स्पेस() स्ट्रिंग के बीच में डुप्लिकेट व्हाइटस्पेस वर्ण (स्थान, टैब, और/या कैरिज रिटर्न) हटा देगा और उन्हें एक ही स्थान में परिवर्तित कर देगा। –

उत्तर

6

जैसे टिम रॉबिन्सन बताते हैं, translate चाल करेगा। (मैं इसे "हैक" नहीं कहूंगा, लेकिन फिर मैं XSLT के साथ अपने रिश्ते के पहचान-के-मेरे-यातना मंच पर रहा हूं।) यदि आप इस तरह कुछ उपयोग करते हैं तो आपका कोड बहुत अधिक पठनीय होगा :

<xsl:variable name="uc" value="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/> 
<xsl:variable name="lc" value="abcdefghijklknopqrstuvwxyz"/> 
<xsl:variable name="ws" value=" &#13;&#10;&#09"/> 

... जो globals.xslt फ़ाइल है कि मैं सबसे रूपांतरण मैं लिखने के शीर्ष पर शामिल का हिस्सा है। फिर यह:

<xsl:value-of select="translate(x, concat($uc, $ws), $lc)"/> 

प्रत्येक ऊपरी-केस अक्षर को इसके निचले-मामले समकक्ष में और प्रत्येक व्हाइटस्पेस चरित्र को कुछ भी नहीं में अनुवाद करता है।

आमतौर पर xsl:variable का उपयोग करने का कारण कोड को और अधिक पठनीय (जैसा कि उपर्युक्त उदाहरण में) है, या इंटरमीडिएट परिणामों को स्टोर करना है जिन्हें अन्यथा प्रभावी ढंग से गणना नहीं की जा सकती है। आउटपुट में डेटा प्राप्त करने का चौथा तरीका वह है जिसे आपने उल्लेख नहीं किया है, और यह बहुत उपयोगी है: विशेषता मान टेम्पलेट। ये सभी एक ही काम करते हैं:

<link> 
    <xsl:attribute name="name"> 
     <xsl:value-of select="translate(name, concat($uc, $ws), $lc)"/> 
    </xsl:attribute> 
</link> 

<link> 
    <xsl:attribute name="name" value="translate(name, concat($uc, $ws), $lc)"/> 
</link> 

<xsl:variable name="linkName" value="translate(name, concat($uc, $ws), $lc)"/> 
<link name="{$linkName}"/> 

इस विशेष मामले में, यह तर्कसंगत है कि अंतिम दो में से कौन सा सरल और स्पष्ट है। अधिकांश समय, हालांकि, यह नहीं है: आउटपुट में डालने वाले मूल्यों की गणना को अलग करने से दोनों को समझना आसान हो जाता है, जैसा कि अधिक वर्बोज़ XSLT संरचनाओं के बजाय एवीटी का उपयोग करता है जो वही काम करता है।

3

यह शुरुआत और अंत नहीं बल्कि बीच में सफेद स्थान को हटा। कोई सुझाव?

आप स्पेस, न्यूलाइन और कैरिज रिटर्न कैरेक्टर को पट्टी करने के लिए translate(' &#13;&#10;', '') का उपयोग कर सकते हैं। यदि आप अपने ट्रांसफॉर्म करने के लिए .NET कक्षाओं या MSXSL का उपयोग कर रहे हैं तो वर्णों को कम मामले में बदलना थोड़ा मुश्किल है। एक हैक जिसका मैंने उपयोग किया है, ऊपरी केस अक्षरों को उनके निचले केस समकक्षों में बदलने के लिए transform का उपयोग करना है; दूसरा lower-case फ़ंक्शन प्रदान करने के लिए .NET एक्सटेंशन ऑब्जेक्ट लिखना है। lower-case फ़ंक्शन XPath/XSL 2.0 में बनाया गया है।

आपके प्रश्न के दूसरे भाग में, वे अलग अलग बातें करते हैं:

  • <xsl:value-of ... स्थानों एचटीएमएल
  • <xsl:attribute ... में सीधे एक मूल्य के मौजूदा HTML तत्व पर एक विशेषता बनाता है और यह एक मूल्य प्रदान करती है
  • <xsl:variable ... एचटीएमएल को प्रभावित किए बिना एक एक्सएसएल वैरिएबल घोषित करता है। आप <xsl:value-of select="$x"/> का उपयोग कर इस चर को HTML में लिख सकते हैं।
संबंधित मुद्दे

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