2011-05-26 9 views
5

मुझे एमआरएसएस आरएसएस फ़ीड में सभी विशेषताओं से पूछताछ की नियमित अभिव्यक्ति शैली प्रतिस्थापन करने की आवश्यकता है, उन्हें केवल यूआरएल पर अलग कर दें। मैं कुछ चीजें यहाँ की कोशिश की है का उपयोग करते हुए यहां से पता चलता है: XSLT Replace function not found लेकिन कोई लाभ नहीं हुआएक्सएसएलटी किसी XML फ़ाइल में सभी यूआरएल से क्वेरीस्ट्रिंग को हटाने के लिए

<?xml version="1.0" encoding="utf-8"?> 
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0"> 
<channel> 
<atom:link href="http://www.videojug.com/user/metacafefamilyandeducation/subscriptions.mrss" type="application/rss+xml" rel="self" /> 
<title>How to and instructional videos from Videojug.com</title> 
<description>Award-winning Videojug.com has over 50k professionally-made instructional videos.</description> 
<link>http://www.videojug.com</link> 
<item> 
    <title>How To Calculate Median</title> 
    <media:content url="http://direct.someurl.com/54/543178dd-11a7-4b8d-764c-ff0008cd2e95/how-to-calculate-median__VJ480PENG.mp4?somequerystring" type="video/mp4" bitrate="1200" height="848" duration="169" width="480"> 
    <media:title>How To Calculate Median</media:title> 
    .. 
    </media:content> 
</item> 

किसी भी सुझाव बहुत उपयोगी करने के लिए

+0

क्या आपको केवल यूआरएल क्वेरी भाग को हटाने की आवश्यकता है? –

उत्तर

3

आप XSLT 2.0 का उपयोग कर रहे हैं, तो आप tokenize() उपयोग कर सकते हैं:

<xsl:template match="media:content"> 
    <xsl:value-of select="tokenize(@url,'\?')[1]"/> 
    </xsl:template> 

<xsl:template match="media:content"> 
    <media:content url="{tokenize(@url,'\?')[1]}"> 
     <xsl:copy-of select="@*[not(name()='url')]"/> 
     <xsl:apply-templates/> 
    </media:content> 
    </xsl:template> 
:

यहाँ केवल media:content की url विशेषता को बदलने का एक और उदाहरण है

संपादित

अपने उदाहरण में सभीurl विशेषताओं को संभाल करने के लिए, और सब कुछ किसी और अपरिवर्तित छोड़, बदलना एक पहचान का उपयोग करें और केवल @url के लिए एक टेम्पलेट के साथ ओवरराइड।

यहां आपके नमूना एक्सएमएल का एक संशोधित संस्करण है। मैंने परीक्षण के लिए description पर दो विशेषताओं को जोड़ा है। attr विशेषता को छूटा नहीं छोड़ा जाना चाहिए और url विशेषता संसाधित की जानी चाहिए।

एक्सएमएल

<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0"> 
    <channel> 
    <atom:link href="http://www.videojug.com/user/metacafefamilyandeducation/subscriptions.mrss" type="application/rss+xml" rel="self"/> 
    <title>How to and instructional videos from Videojug.com</title> 
    <!-- added some attributes for testing --> 
    <description attr="don't delete me!" url="http://www.test.com/foo?anotherquerystring">Award-winning Videojug.com has over 50k professionally-made instructional videos.</description> 
    <link>http://www.videojug.com</link> 
    <item> 
     <title>How To Calculate Median</title> 
     <media:content url="http://direct.someurl.com/54/543178dd-11a7-4b8d-764c-ff0008cd2e95/how-to-calculate-median__VJ480PENG.mp4?somequerystring" type="video/mp4" bitrate="1200" height="848" 
     duration="169" width="480"> 
     <media:title>How To Calculate Median</media:title> 
     .. 
     </media:content> 
    </item> 
    </channel> 
</rss> 

XSLT

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <!--Identity Transform--> 
    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="@url"> 
    <xsl:attribute name="url"> 
     <xsl:value-of select="tokenize(.,'\?')[1]"/> 
    </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

आउटपुट

<rss xmlns:atom="http://www.w3.org/2005/Atom" 
    xmlns:media="http://search.yahoo.com/mrss/" 
    version="2.0"> 
    <channel> 
     <atom:link href="http://www.videojug.com/user/metacafefamilyandeducation/subscriptions.mrss" 
       type="application/rss+xml" 
       rel="self"/> 
     <title>How to and instructional videos from Videojug.com</title> 
     <!-- added some attributes for testing --><description attr="don't delete me!" url="http://www.test.com/foo">Award-winning Videojug.com has over 50k professionally-made instructional videos.</description> 
     <link>http://www.videojug.com</link> 
     <item> 
     <title>How To Calculate Median</title> 
     <media:content url="http://direct.someurl.com/54/543178dd-11a7-4b8d-764c-ff0008cd2e95/how-to-calculate-median__VJ480PENG.mp4" 
         type="video/mp4" 
         bitrate="1200" 
         height="848" 
         duration="169" 
         width="480"> 
      <media:title>How To Calculate Median</media:title> 
     .. 
     </media:content> 
     </item> 
    </channel> 
</rss> 
+0

ठीक है - अच्छा लग रहा है लेकिन इस फ़ाइल में अन्य चीजें भी हो सकती हैं जिनमें यूआरएल विशेषताएं भी हैं। मैं इन सभी विशेषता मानों को ट्रिम करना चाहता हूं। अगर मैं @url पर मैच बदलता हूं तो यह उस विशेषता मान से मेल खाता है (जैसा कि मैं इसे समझता हूं) मैं अस्पष्ट हूं कि मैं यह कैसे सुनिश्चित कर सकता हूं कि जब मैं इसे वापस लिखता हूं तो यह विशेषता को ओवरराइट करता है और बाकी तत्व को संरक्षित करता है? – RichHalliwell

+0

@ रिचहल्लीवेल: आप यह सुनिश्चित करेंगे कि आप अन्य सभी चीज़ों (अन्य तत्वों, विशेषता, टेक्स्ट इत्यादि) को संभालने के लिए पहचान ट्रांसफॉर्म का उपयोग करके केवल यूआरएल विशेषता को ओवरराइट करें। उदाहरण के लिए कृपया मेरा संपादन देखें। –

+0

इसके अलावा, एक अच्छे प्रश्न के लिए +1। –

2

स्ट्रिंग (सैक्सन 9.3.0.5 का उपयोग करते हुए) एक्सएसएलटी में हैंडलिंग आमतौर पर एक्सएसएलटी 2.0 के साथ बहुत आसान है, लेकिन इस मामले में यह XSLT 1.0 के बाद मौजूद सबस्ट्रिंग-पहले() फ़ंक्शन का उपयोग करके आवश्यकता को प्राप्त करने के लिए पर्याप्त आसान लग रहा है।

+2

'substring-before (concat (url, '?'), '?') 'अतिरिक्त असफल सुरक्षा के लिए। – Tomalak

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