2011-12-05 10 views
5

एसएचएच सभी अक्षरों या नियमित अभिव्यक्तियों में होना चाहिए [ए-जेड]। नियमित अभिव्यक्तियों के साथ xslt को कैसे गठबंधन करें?तत्व में अक्षर होने पर xslt कैसे लिखें?

<xsl:if test="string-contains(//ns0:elem/value, 'sth')"> 


     </xsl:if> 
+0

@_marko: क्या आपने मेरा जवाब पढ़ा और क्या यह आपके लिए उपयोगी था? –

+0

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

उत्तर

9

XPath/XSLT 1.0 नियमित अभिव्यक्तियों का समर्थन नहीं करता है, लेकिन बुनियादी स्ट्रिंग फ़ंक्शंस का उपयोग करके सरल सत्यापन किया जा सकता है।

श्वेत सूची बनाती

XPath 1.0 translate समारोह एक श्वेत सूची अनुकरण करने के लिए इस्तेमाल किया जा सकता:

<xsl:variable name="alpha" 
       select="'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> 
<xsl:if test="string-length(translate(., $alpha, '')) &gt; 0"> 
    <!-- context node contains non-alpha characters --> 
</xsl:if> 

परीक्षण translate का उपयोग करता है पहले सभी ऊपरी और छोटे अक्षरों हटाने के लिए।यदि परिणामी स्ट्रिंग की लंबाई गैर-शून्य है, तो मूल स्ट्रिंग में अतिरिक्त वर्ण होने चाहिए।

ध्यान दें कि ऊपर अभिव्यक्ति को सरल किया जा सकता है:

<xsl:if test="translate(., $alpha, '')"> 

... किसी भी गैर खाली स्ट्रिंग सही का आकलन है।

<xsl:if test="translate(., translate(., $alpha, ''), '')"> 
    <!-- context-node contains characters on the blacklist (in $alpha) --> 
</xsl:if> 

भीतरी translate एक स्ट्रिंग रिटर्न अपने सभी अल्फा पात्रों के साथ हटा दिया है, जो तब के रूप में प्रयोग किया जाता है:

ब्लैकलिस्टिंग

$alpha एक काली सूची के रूप में इलाज के लिए उपयोग डबल का अनुवाद विधि दूसरे translate कॉल पर टेम्पलेट, जिसके परिणामस्वरूप केवल एक अल्फा वर्ण युक्त स्ट्रिंग होती है। यदि यह स्ट्रिंग गैर-शून्य है, तो हमें ब्लैकलिस्ट पर एक वर्ण मिला। यह एक क्लासिक दृष्टिकोण है। इतने पर उदाहरण के लिए देखें, यह वीडियो पिछले सवाल: स्ट्रिंग की लंबाई सभी हटाने के बाद

not(string-length(translate(., $alpha, ''))=string-length()) 

हैं:

कालीसूची परीक्षण भी इस तरह किया जा सकता है ब्लैकलिस्टेड वर्णों की मूल स्ट्रिंग की लंबाई के बराबर नहीं है, तो स्ट्रिंग में ब्लैकलिस्ट पर एक वर्ण होना चाहिए।

सारांश

ब्लैकलिस्ट और श्वेतसूची वास्तव में एक ही सिक्के के दो पहलू हैं। निम्नलिखित उनके उपयोग को एक साथ प्रदर्शित करता है:

<xsl:if test="translate(., $alpha, '')"> 
    [contains some characters not on the list] 
</xsl:if> 
<xsl:if test="not(translate(., $alpha, ''))"> 
    [contains only characters on the list] 
</xsl:if> 
<xsl:if test="translate(., translate(., $alpha, ''), '')"> 
    [contains some characters on the list] 
</xsl:if> 
<xsl:if test="not(translate(., translate(., $alpha, ''), ''))"> 
    [contains only characters not on the list] 
</xsl:if> 
2

XPath 1.0 में (XSLT 1.0 के साथ काम करता है), तो आप रेगुलर एक्सप्रेशन के लिए उपकरण (आप बस contains या starts-with की तरह कार्य होते हैं, अधिक जानकारी के लिए नीचे दिए गए लिंक देखें)

XPATH 2.0 में (नहीं है एक्सएसएलटी 2.0 के साथ काम करता है), आपको matches फ़ंक्शन और replace फ़ंक्शन मिल गया है (नीचे लिंक देखें)।

यूआरएल को देखने के लिए:

XPath 1.0 स्ट्रिंग कार्य: http://www.w3.org/TR/xpath/#section-String-Functions

XPath 2.0 regex कार्य: http://www.w3.org/TR/xpath-functions/#string.match

+1

मुझे एक समाधान मिला है और संस्करण 1.0 का उपयोग कर रहे हैं। यदि आप xslt में regex का उपयोग नहीं कर सकते हैं तो स्ट्रिंग में अक्षरों को कैसे खोजें? – marko

2

एक स्ट्रिंग में पत्र के लिए खोज करने के लिए कैसे यदि आप में regex का उपयोग नहीं कर सकते xslt?

अच्छा प्रश्न, +1।

उपयोग:

translate(., translate(., $vAlpha, ''), '') 

यह वर्तमान नोड के स्ट्रिंग मान के सभी पात्रों पर पैदा करता है, कि$vAlpha

मेंहैं मामले में आप आप देखना चाहते हैं एक दिया गया स्ट्रिंग $str में केवल अक्षर और कोई अन्य वर्ण नहीं है, का उपयोग करें :

string-length(translate($str, $vAlpha, '')) = 0 

एक पूरा कोड उदाहरण:

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

<xsl:variable name="vUpper" select= 
    "'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> 

<xsl:variable name="vLower" select= 
    "'abcdefghijklmnopqrstuvwxyz'"/> 

<xsl:variable name="vAlpha" select= 
     "concat($vUpper, $vLower)"/> 

<xsl:variable name="vStr" select="'A12B_..c02d'"/> 

<xsl:template match="/"> 
    <xsl:value-of select= 
    "translate($vStr, 
       translate($vStr, $vAlpha, ''), '') 
    "/> 


    The string <xsl:value-of select="$vStr"/> has <xsl:text/> 
    <xsl:value-of select= 
    "string-length(translate($vStr, $vAlpha, ''))"/> <xsl:text/> 
    non-letters 

</xsl:template> 
</xsl:stylesheet> 

जब इस बदलाव किसी भी XML दस्तावेज़ (इस्तेमाल नहीं किया) पर लागू किया जाता है, चाहता था, सही परिणाम उत्पादन किया जाता है:

ABcd 


    The string A12B_..c02d has 7 
    non-letters 

याद रखें: पहली XPath अभिव्यक्ति उपर्युक्त "डबल-अनुवाद विधि" प्रदर्शित करता है, जिसे पहले @ माइकल के द्वारा प्रस्तावित किया गया था।