2012-06-25 13 views
11

में एक एकल कथन लिखकर आउटपुट में सभी नेमस्पेस घटना से कैसे बचें मैंने "बहिष्कार-परिणाम-उपसर्ग" लिखा और फिर भी मुझे आउटपुट में नाम स्थान उपस्थिति दिखाई देती है।एक्सएसएलटी

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:simple="Simple name space" 
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    xmlns:tcm="http://www.tridion.com/ContentManager/5.0" 
    xmlns:xh="http://www.w3.org/1999/xhtml" 
    xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:transform-ext="urn:tridion:transform-ext" 
    xmlns="http://www.w3.org/1999/xhtml" 
    exclude-result-prefixes="#default simple xh"> 

वास्तविक उत्पादन

<strong xmlns="Simple name space">abcd 
    <link xmlns="http://www.w3.org/1999/xhtml"> 
     <text>Header</text> 
    </link> 
</strong> 

वहाँ कोई भी तरीका तो यह है कि मैं एक बयान लिख कर सभी नाम स्थान को बाहर कर सकते है।

यहाँ मैं स्पष्ट रूप से उल्लेख किया

exclude-result-prefixes="#default simple xh" 

xslt में सभी नाम स्थान उपस्थिति से बचने के लिए कैसे?

उत्तर

7

xsl:stylesheet की exclude-result-prefixes विशेषता, जब "yes" जनादेश को हटाने के रूप में निर्दिष्ट

आप पूरी तरह से नामस्थान निकालना चाहते हैं, तो आपको निम्न स्टाइलशीट इस्तेमाल कर सकते हैं लिटरेरल परिणाम तत्व (केवल) के किसी भी नामस्थान नोड्स विरासत में हैं और नामस्थान-यूरी और शाब्दिक परिणाम तत्व के उपसर्ग दोनों को परिभाषित नहीं करते हैं। परिणाम की जड़ टैग पर "विशेषता"

मार्कस Jarderot द्वारा जवाब में निम्नलिखित बयान गलत है:

"foo = को बाहर-परिणाम-उपसर्गों सिर्फ xmlns को हटा"।

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:z="z:z" exclude-result-prefixes="z"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <z:x xmlns:z="z:z"> 
    <z:y/> 
    </z:x> 
</xsl:template> 
</xsl:stylesheet> 

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

<z:x xmlns:z="z:z"> 
    <z:y/> 
</z:x> 

यहाँ एक जवाबी उदाहरण है हम देखते हैं कि:

  1. नाम स्थान नोड (और परिभाषा) मूल्य के साथ नाम स्थान के लिए (नाम स्थान-uri) "Z: Z" शीर्ष तत्व से नहीं हटाया जाता है (क्या मार्कस Jarderot कॉल "रूट टैग")।

  2. उपसर्ग "z" के साथ नामस्थान किसी भी शाब्दिक तत्व से हटाया नहीं गया है।

कि साधारण तथ्य यह है कि निर्दिष्ट करने exclude-result-prefixes="yes" एक नाम स्थान नहीं निकाल सकते कि यह एक LRE (शाब्दिक परिणाम तत्व) पर नहीं है और एक नाम स्थान नोड एक LRE पर है, भले ही लेकिन नाम स्थान को परिभाषित किया गया है पता चलता है, जो करने के लिए तत्व से संबंधित है।

नामस्थान से तत्व को निकालने के लिए यह गैर-एलआरई तत्वों से नामस्थानों से संबंधित है, या नाम हटाएं, हमें कुछ अतिरिक्त प्रोसेसिंग निर्दिष्ट करने की आवश्यकता है।

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()[not(self::*)]"> 
    <xsl:copy> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*"> 
    <xsl:element name="{local-name()}"> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="@*"> 
    <xsl:attribute name="{local-name()}"> 
    <xsl:value-of select="."/> 
    </xsl:attribute> 
</xsl:template> 
</xsl:stylesheet> 

ऊपर परिवर्तन किसी भी तत्व को बदल देता है या एक इसी तत्व या विशेषता "कोई नाम स्थान" के अंतर्गत आता है उस के साथ विशेषता:

एक उदाहरण निम्नलिखित के साथ परंपरागत पहचान शासन की प्रतिस्थापन है। इसके लिए एक संभावित उपयोग किसी दस्तावेज़ को डिफ़ॉल्ट नामस्थान के साथ किसी दस्तावेज़ में कनवर्ट करना है।

उदाहरण के लिए, जब निम्न स्रोत XML दस्तावेज़ पर लागू:

<z:x xmlns:z="z:z"> 
    <z:y z:attr="someValue"/> 
</z:x> 

परिवर्तन का परिणाम है:

<x> 
    <y attr="someValue"/> 
</x> 

अंत में एक चेतावनी:

यह ट्रांसफॉर्म आयन हानिकारक हो सकता है यदि दस्तावेज़ों पर लागू होता है जिसमें दो तत्व होते हैं (या दो विशेषताएँ) जिनमें एक ही स्थानीय नाम होता है लेकिन दो अलग-अलग नामस्थानों से संबंधित होता है - परिवर्तन इन तत्वों (या विशेषताओं) के साथ बदलता है जो दोनों एक ही नामस्थान से संबंधित होते हैं (नहीं नाम स्थान)।

+0

XSL 2.0 और नकल तत्वों का उपयोग करते समय या तो '' बहुत उपयोगी कॉपी-namespaces' विशेषता 'या' ', वहाँ भी है का उपयोग कर। तत्व की प्रतिलिपि करते समय नामस्थानों की प्रतिलिपि बनाने के लिए इसे 'नहीं' पर सेट करें। Http://zvon.org/comp/r/ref-XSLT_2.html#Attributes~copy-namespaces पर अधिक जानकारी। –

+0

@ एरिक्क्रेट्लेन्डी, हाँ, यह उपयोगी है। दुर्भाग्यवश, यह एक एक्सएसएलटी 2.0 प्रश्न नहीं है। इस उत्तर का उपयोग किया जा सकता है (दोनों के बीच पोर्टेबल है) दोनों एक्सएसएलटी 1.0 और एक्सएसएलटी 2.0/3.0 –

+0

हां, यह एक्सएसएल 1.0 के लिए नहीं है। मैं इस समस्या में भाग गया और आपका समाधान पाया, लेकिन तकनीकी बाधाओं के कारण, मैंने इसके बारे में एक और तरीका खोजना जारी रखा, और 'कॉपी-नेमस्पेस' विशेषता पाई। पूर्णता के लिए, मैंने भविष्य के साधकों के लिए टिप्पणी जोड़ा। –

3

exclude-result-prefixes परिणाम के रूट टैग पर xmlns:foo="" विशेषताएँ हटा देता है। टैग अभी भी एक ही नामस्थान से बंधे हैं। चूंकि टैग में कोई मिलान करने वाला उपसर्ग नहीं है, इसलिए डिफ़ॉल्ट नामस्थान का उपयोग किया जाता है।

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

    <xsl:template match="/|comment()|processing-instruction()"> 
     <xsl:copy> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*"> 
     <xsl:element name="{local-name()}"> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="@*"> 
     <xsl:attribute name="{local-name()}"> 
      <xsl:value-of select="."/> 
     </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

(स्रोत: TEI wiki)

2

बहिष्कार-परिणाम-उपसर्ग विशेषता (कुछ स्थितियों में) आउटपुट से अप्रयुक्त नामस्थान घोषणाओं को हटा देंगी। यह उन नामस्थानों को कभी भी नहीं हटाएगा जो वास्तव में तत्व और गुणों के लिए उपयोग में हैं: यानी, यह कभी भी तत्वों और विशेषताओं के नामों को किसी भिन्न नामस्थान (या नामस्थान में) में रखने के लिए कभी नहीं बदलेगा। यदि आप तत्वों को नेमस्पेस में नहीं रखना चाहते हैं, तो आपको उन्हें उत्पन्न करते समय नामस्थान में रखना होगा, चाहे शाब्दिक परिणाम तत्वों का उपयोग करके, xsl: element, या xsl: copy।

0

कोशिश अपने स्टाइलशीट में इस का उपयोग करने के लिए:

<stylesheet 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:xhtml="http://www.w3.org/1999/xhtml" ...etc > 

मैं कुछ टैग के अंदर इस था: xmlns="http://www.w3.org/1999/xhtml, तो मैं उन 2 लाइनों और ठीक है अब गयी।

इस स्रोत मुझे मदद मिली: http://xmlplease.com/xhtmlxhtml