2009-07-02 10 views
18

मैं कुछ एक्सएमएल जो एक नाम स्थान जो केवल विशेषताओं के लिए प्रयोग किया जाता है वाणी मिल गया है, इस तरह निकालें:XSL - तत्वों नकल लेकिन अप्रयुक्त नाम स्थान (रों)

<?xml version="1.0" encoding="UTF-8"?> 
<a xmlns:x="http://tempuri.com"> 
    <b> 
     <c x:att="true"/> 
     <d>hello</d> 
    </b> 
</a> 

मैं एक प्रतिलिपि बनाने के लिए XSL का उपयोग करना चाहते चयनित नोड्स और उनके मूल्यों - गुणों से छुटकारा पाएं। तो मेरी वांछित आउटपुट है:

<?xml version="1.0" encoding="UTF-8"?> 
<b> 
    <c /> 
    <d>hello</d> 
</b> 

मैं कुछ XSL कि लगभग करता मिल गया है, लेकिन मैं इसे उत्पादन की उच्च स्तर घटक में नाम स्थान घोषणा डाल को रोकने के लिए नहीं कर पा रहे। मेरे XSL है:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/"> 
     <xsl:apply-templates select="https://stackoverflow.com/a/b"/> 
    </xsl:template> 

    <xsl:template match="node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

उत्पादन के पहले तत्व <b xmlns:x="http://tempuri.com"> बजाय <b> है। मैंने एक्सएसएल में नेमस्पेस घोषित करने और exclude-result-prefixes सूची में उपसर्ग डालने का प्रयास किया है, लेकिन ऐसा कोई प्रभाव नहीं प्रतीत होता है। मैं क्या गलत कर रहा हूं?

अपडेट: मैंने पाया है कि एक्सएसएल में नेमस्पेस घोषित करके और extension-element-prefixes विशेषता का उपयोग करके, लेकिन यह सही नहीं लगता है! मुझे लगता है कि मैं इसका उपयोग कर सकता हूं, लेकिन मुझे यह जानना है कि exclude-result-prefixes क्यों काम नहीं करता है!

अद्यतन: असल में, ऐसा लगता है कि यह extension-element-prefixes समाधान केवल XMLSpy के अंतर्निर्मित एक्सएसएलटी इंजन के साथ काम करता है, एमएसएक्सएमएल के साथ नहीं।

उत्तर

9
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
    xmlns:x="http://tempuri.com"> 
    <xsl:template match="/"> 
     <xsl:apply-templates select="https://stackoverflow.com/a/b"/> 
    </xsl:template> 

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

    <xsl:template match="@*"> 
     <xsl:copy/> 
    </xsl:template> 

    <!-- This empty template is not needed. 
Neither is the xmlns declaration above: 
    <xsl:template match="@x:*"/> --> 
</xsl:stylesheet> 

मुझे एक स्पष्टीकरण here मिला।

माइकल Kay ने लिखा है:
को बाहर-परिणाम-उपसर्गों केवल नामस्थान एक शाब्दिक परिणाम तत्व द्वारा स्टाइलशीट से नकल को प्रभावित करता है, यह नामस्थान की नकल स्रोत दस्तावेजों से प्रभावित नहीं करता।

+0

धन्यवाद, यह (हालांकि "@ *" टेम्पलेट के लिए आवश्यक हो प्रतीत नहीं होता है) काम करता है, लेकिन मैं "स्थानीय नाम सोचा () "समारोह बहुत धीमी थी ..? –

+1

मुझे एक्सएसएलटी 2.0 चाहिए! – Riri

+0

लगभग सही है, लेकिन एक्स: एट विशेषता आउटपुट से गुम है। "@ *" टेम्पलेट नहीं बुलाया जाता है। को जोड़ने का प्रयास करें। –

5
<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:x="http://tempuri.com" 
    exclude-result-prefixes="x" 
> 

    <!-- the identity template copies everything 1:1 --> 
    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()" /> 
    </xsl:copy> 
    </xsl:template> 

    <!-- this template explicitly cares for namespace'd attributes --> 
    <xsl:template match="@x:*"> 
    <xsl:attribute name="{local-name()}"> 
     <xsl:value-of select="." /> 
    </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 
2

यह उत्पादन से एक्स नाम स्थान को हटा देगा।

<xsl:namespace-alias result-prefix="#default" stylesheet-prefix="x" /> 

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

4

प्रयास करें इस (विशेषता copy-namespaces='no' ध्यान दें):

<xsl:template match="node()"> 
    <xsl:copy copy-namespaces="no"> 
      <xsl:apply-templates select="node()"/> 
    </xsl:copy> 
</xsl:template>