2010-06-20 18 views
6

मैं सिर्फ यह जानना चाहता हूं कि तत्व की match विशेषता में नियमित अभिव्यक्तियों का उपयोग करना संभव है या नहीं। जब मैं xsl:template की match विशेषता में वाक्य रचना matches(node-name(*),'line$') इस्तेमाल करने की कोशिशxsl में नियमित अभिव्यक्तियां: टेम्पलेट मिलान विशेषता

<xsl:stylesheet> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="*"/> 
    </xsl:template> 

    <xsl:template match="matches(node-name(*),'line')"> 
     <xsl:value-of select="."/> 
    </xsl:template> 

</xsl:stylesheet> 

: अब XSLT ऊपर दस्तावेज़ को बदलने के लिए

<greeting> 
    <aaa>Hello</aaa> 
    <bbb>Good</bbb> 
    <ccc>Excellent</ccc> 
    <dddline>Line</dddline> 
</greeting> 

: उदाहरण के लिए, मैं पालन XML दस्तावेज़ है लगता है तत्व, यह एक त्रुटि संदेश पुनर्प्राप्त करता है। क्या मैं match विशेषता में नियमित अभिव्यक्तियों का उपयोग कर सकता हूं?

धन्यवाद बहुत बहुत

+2

, बस पाठ बॉक्स है, जहां यह कहते हैं बगल में स्थित बॉक्स पढ़ें * " प्रारूप कैसे करें: इंडेंट कोड 4 रिक्त स्थान "*। तो आपको '<' आदि का उपयोग करने की आवश्यकता नहीं है ... –

+0

अच्छा प्रश्न (+1)। मेरा जवाब देखें, इस समय आपके दो संबंधित प्रश्नों का एकमात्र सही समाधान है। :) –

उत्तर

14

यहाँ मिलान (XSLT में 2.0 मैचों() pattern तर्क के रूप में एक असली RegEx के साथ उपयोग समारोह) की सही XSLT 1.0 तरीका है:

एक तत्व जिसका नाम मिलान शामिल 'line':

<xsl:template match="*[contains(name(), 'line')]"> 
    <!-- Whatever processing is necessary --> 
</xsl:template> 

एक तत्व जिसका नाम समाप्त होता है मिलान 'line' में:

<xsl:template match="*[substring(name(), string-length() -3) = 'line']"> 
    <!-- Whatever processing is necessary --> 
</xsl:template> 

@Tomalak दिए गए स्ट्रिंग के साथ समाप्त होने वाले नाम ढूंढने का एक और XSLT 1.0 तरीका प्रदान किया गया। उनका समाधान एक विशेष चरित्र का उपयोग करता है जिसे किसी भी नाम पर कभी भी मौजूद नहीं होने की गारंटी दी जाती है। मेरा समाधान यह पता लगाने के लिए लागू किया जा सकता है कि क्या कोई स्ट्रिंग (केवल तत्व का नाम नहीं) किसी अन्य स्ट्रिंग के साथ समाप्त होता है।

एक्सएसएलटी 2 में।एक्स:

उपयोग:

: matches(name(), '.*line$') ऐसे नाम हैं जो स्ट्रिंग "line"

यह परिवर्तन के साथ समाप्त मैच के लिए

जब थीस XML दस्तावेज़ पर लागू: उत्पादन केवल तत्व को

<greeting> 
    <aaa>Hello</aaa> 
    <bblineb>Good</bblineb> 
    <ccc>Excellent</ccc> 
    <dddline>Line</dddline> 
</greeting> 

प्रतियां, जिसका नाम स्ट्रिंग "line" साथ समाप्त होता है:

<dddline>Line</dddline> 

जबकि यह परिवर्तन (का उपयोग करता है 10): उत्पादन सभी तत्वों, जिनके नाम स्ट्रिंग "line" को रोकने के लिए

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="*[matches(name(), '.*line')]"> 
    <xsl:copy-of select="."/> 
</xsl:template> 

<xsl:template match="*[not(matches(name(), '.*line'))]"> 
    <xsl:apply-templates select="node()[not(self::text())]"/> 
</xsl:template> 
</xsl:stylesheet> 

प्रतियां:

<bblineb>Good</bblineb> 
<dddline>Line</dddline> 
अगली बार
+0

सबसे पहले, आपके प्रयास से बहुत बहुत धन्यवाद, यह पहली बार था जब मैंने इस मंच में संदेह पोस्ट किया था, मैं वास्तव में प्रतिक्रिया देने के लिए आश्चर्यचकित हूं। मैं xslt का संस्करण याद करता हूं जो मैं काम करने का नाटक करता हूं, यह होगा 2.0 हो और हाँ मैं एक स्ट्रिंग पर स्ट्रिंग 'लाइन' खोजना चाहता हूं। एक बार आपके समर्थन – tt0686

+0

@pedromarquescosta द्वारा बहुत अधिक thnaks: आपका स्वागत है। मैंने अनुरोध किया गया एक्सएसएलटी 2.0 समाधान के साथ मेरा जवाब अपडेट किया है जो RegEx का उपयोग करता है। –

5

XSLT 1.0 (और 2.0, भी) में, अपने (उदाहरण के लिए, यह नहीं एक regex, हालांकि है):

<xsl:template match="*[contains(name(), 'line')]"> 
    <xsl:value-of select="."/> 
</xsl:template> 

और एक अंत के स्ट्रिंग मैच प्राप्त करने के लिए :

<xsl:template match="*[contains(concat(name(), '&#xA;'), 'line&#xA;')]"> 
    <xsl:value-of select="."/> 
</xsl:template> 

XSLT 2.0 में आप निश्चित रूप से matches() समारोह के स्थान पर उपयोग कर सकते हैं।

+0

@ डिमिट्री: जैसा कि आपने कहा था, एलएफ 'name()' का हिस्सा नहीं हो सकता है। इसलिए यदि आप XPath 2.0 (और regex) का उपयोग नहीं कर सकते हैं, तो यह उस नाम से मेल खाने का एक तरीका होगा जिसमें स्ट्रिंग '' लाइन'' को इसके अंत में, कहीं भी हो। ओपी ऐसा लगता है, क्योंकि वह रेगेक्स 'लाइन $' 'का उल्लेख करता है, और उसने एक्सएसएलटी संस्करण का उपयोग नहीं किया है। मैं अंतरिक्ष, या किसी अन्य चरित्र का उपयोग कर सकता था जो नामों में अवैध है। तो यह बिल्कुल अर्थहीन या गलत नहीं है। ;-) – Tomalak

+0

ठीक है, अब मैं देखता हूं। नामों के लिए यह काम करता है। –

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