2009-12-04 14 views
12

ठीक है, मैंने इस प्रश्न पर कई भिन्नताएं देखी हैं, लेकिन कोई भी वास्तव में उत्तर देने की कोशिश नहीं कर रहा है और शायद मैं ' मैं यह देखने के लिए बहुत घना हूं कि मैं जो कुछ करने की कोशिश कर रहा हूं उसके दूसरे उत्तरों में से एक को कैसे लागू किया जाए।एक्सएमएलटी द्वारा एक्सएमएलटी = "" एक्सएमएलटी द्वारा उत्पादित प्रविष्टियों को कैसे हटाया जाए, एक एक्सएमएल दस्तावेज़ को दूसरे एक्सएमएल दस्तावेज़

<?xml version="1.0" encoding="utf-8"?> 
<message> 
    <cmd id="api_info"> 
    <api-version>1.0</api-version> 
    <api-build>1.0.0.0</api-build> 
    </cmd> 
</message> 

अब मैं एक XSLT बदलना है कि मैं इस एक्सएमएल के लिए आवेदन कर रहा हूँ है:

मैं कुछ एक्सएमएल कि निम्न तरह दिखता है। XSLT निम्नलिखित के समान है:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:fo="http://www.w3.org/1999/XSL/Format" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xmlns:fn="http://www.w3.org/2005/xpath-functions" 
       version="2.0"> 

    <xsl:output method="xml" version="1.0" indent="yes"/> 

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

    <xsl:template match="message"> 
     <xsl:element name="message" xmlns="http://www.companyname.com/schemas/product/Version001"> 
      <xsl:apply-templates select="/message/cmd/@id"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="/message/cmd/@id"> 
     <xsl:variable name="_commandType" select="/message/cmd/@id"/> 
     <xsl:element name="messageHeader"> 
      <xsl:element name="cmdType"> 
       <xsl:value-of select="$_commandType"/> 
      </xsl:element> 
     </xsl:element> 

     <xsl:element name="messageBody"> 
      <xsl:choose> 
       <xsl:when test="$_commandType = 'api_info'"> 
        <xsl:element name="apiInfoBody"> 
         <xsl:element name="apiVersion"> 
          <xsl:value-of select="/message/cmd/api-version"/> 
         </xsl:element> 
         <xsl:element name="apiBuild"> 
          <xsl:value-of select="/message/cmd/api-build"/> 
         </xsl:element> 
        </xsl:element> 
       </xsl:when> 
       <xsl:when test="$_commandType = 'communicationError'"> 
        <xsl:element name="communicationErrorBody"> 
         <xsl:element name="errorCode"> 
          <xsl:value-of select="error-code"/> 
         </xsl:element> 
         <xsl:element name="badCmd"> 
          <xsl:value-of select="bad-cmd"/> 
         </xsl:element> 
        </xsl:element> 
       </xsl:when> 
      </xsl:choose> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

उत्पादन मैं मूल रूप से है मैं क्या चाहते हैं और की तरह लग रहा है:

<?xml version="1.0" encoding="UTF-8"?> 
<message xmlns="http://www.companyname.com/schemas/product/Version001"> 
    <messageHeader xmlns=""> 
     <cmdType>api_info</cmdType> 
    </messageHeader> 
    <messageBody xmlns=""> 
     <apiInfoBody> 
      <apiVersion>1.0</apiVersion> 
      <apiBuild>1.0.0.0</apiBuild> 
     </apiInfoBody> 
    </messageBody> 
</message> 

लेकिन क्या मैं नहीं करना चाहती xmlns हैं = " "< messageHeader में विशेषताओं > और <messageBody> तत्वों।

अब मुझे पता चला है कि अगर मैं स्पष्ट रूप से उन तत्वों के लिए एक्सएसएलटी में नामस्थान निर्दिष्ट करता हूं, तो अवांछित विशेषता उन गुणों के बच्चों को एक स्तर से नीचे धकेल देती है।

मैं सिर्फ अपने पूरे XSLT के माध्यम से जाने के लिए और स्पष्ट रूप से मेरी XSL से प्रत्येक के लिए xmlns = "" http://www.companyname.com/schemas/product/Version001 "जोड़ने विशेषता सकता है:। परिभाषाओं तत्व है, लेकिन मुझे पता है कि वहाँ एक और अधिक सुरुचिपूर्ण तरीका होना चाहिए हम प्रोग्रामर इस तरह के बकवास के लिए शॉर्टकट नहीं होने के लिए बहुत आलसी हैं। अगर मेरे एक्सएसएलटी में संक्षिप्त उदाहरण के रूप में कुछ आसान नहीं था, तो मैं इसे इस तरह से करने का लुत्फ उठाता हूं। लेकिन मुझे पता है कि एक बेहतर तरीका होना चाहिए।

क्या किसी को पता है कि मैं यहाँ क्या याद कर रहा हूँ?

धन्यवाद,

+०१२३५१६४१०६१

AlarmTripper

उत्तर

8

उपयोग को बाहर-परिणाम-उपसर्गों XSL पर: उपसर्ग "#default"

इस के लिए W3C में संदर्भ HERE

संपादित है साथ स्टाइलशीट टैग: ठीक है, मैं होना चाहिए अपने एक्सएसएल का अधिक ध्यान से अध्ययन किया। स्टाइलशीट टैग पर संदेश टैग पर xmlns को ले जाएं। यह सभी परिणाम तत्वों को एक ही नामस्थान में रखेगा और परिणामस्वरूप टैग टैग पर एक नेमस्पेस विशेषता होगी। मैंने इसे ऑक्सीजन/एक्सएमएल में चलाया और आपको जो आउटपुट चाहिए वो मिला।

+0

आउटपुट एक्सएमएल को नहीं बदला। – AlarmTripper

+0

आप किस एक्सएसएलटी प्रोसेसर का उपयोग कर रहे हैं? –

+0

हां, मैंने पुष्टि की है कि आपका नया सुझाव भी काम करता है और संभवतः मेरे से बेहतर समाधान है क्योंकि यह स्टाइलशीट तत्व में xmlns असाइनमेंट रखता है। और #default विकल्प मुझे अन्य सभी नामस्थान उपसर्गों को बाहर करने से रोकता है। बहुत बहुत धन्यवाद। मुझे इस एक्सएसएलटी सामान के बारे में जानने के लिए बहुत कुछ मिला है और मुझे लगता है कि नामस्थान शायद इसके सबसे कठिन पहलुओं में से एक हैं। – AlarmTripper

0

ठीक है, मैंने इसे समझ लिया।

XSLT मैं चाहता हूँ इस तरह दिखता है:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:fo="http://www.w3.org/1999/XSL/Format" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xmlns:fn="http://www.w3.org/2005/xpath-functions" 
       exclude-result-prefixes="xsl fo xs fn"> 

    <xsl:output method="xml" version="1.0" indent="yes"/> 

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

    <xsl:template match="message"> 
     <message namespace="http://www.companyname.com/schemas/product/Version001"> 
      <xsl:apply-templates select="/message/cmd/@id"/> 
     </message> 
    </xsl:template> 

    <xsl:template match="/message/cmd/@id"> 
     <xsl:variable name="_commandType" select="/message/cmd/@id"/> 

     <xsl:element name="messageHeader"> 
      <xsl:element name="cmdType"> 
       <xsl:value-of select="$_commandType"/> 
      </xsl:element> 
     </xsl:element> 

     <xsl:element name="messageBody"> 
      <xsl:choose> 
       <xsl:when test="$_commandType = 'api_info'"> 
        <xsl:element name="apiInfoBody"> 
         <xsl:element name="apiVersion"> 
          <xsl:value-of select="/message/cmd/api-version"/> 
         </xsl:element> 
         <xsl:element name="apiBuild"> 
          <xsl:value-of select="/message/cmd/api-build"/> 
         </xsl:element> 
        </xsl:element> 
       </xsl:when> 
       <xsl:when test="$_commandType = 'communicationError'"> 
        <xsl:element name="communicationErrorBody"> 
         <xsl:element name="errorCode"> 
          <xsl:value-of select="error-code"/> 
         </xsl:element> 
         <xsl:element name="badCmd"> 
          <xsl:value-of select="bad-cmd"/> 
         </xsl:element> 
        </xsl:element> 
       </xsl:when> 
      </xsl:choose> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

परिवर्तन यह है कि तय यह को बाहर-परिणाम-उपसर्गों< XSL में जोड़ने के लिए विशेषता थी: स्टाइलशीट > तत्व और अनुभाग बदलने के लिए कि था:

:

<xsl:template match="message"> 
     <xsl:element name="message" xmlns="http://www.companyname.com/schemas/product/Version001"> 
      <xsl:apply-templates select="/message/cmd/@id"/> 
     </xsl:element> 
    </xsl:template> 

बजाय निम्न होने के लिए

<xsl:template match="message"> 
     <message namespace="http://www.companyname.com/schemas/product/Version001"> 
      <xsl:apply-templates select="/message/cmd/@id"/> 
     </message> 
    </xsl:template> 

और अब मैं फिर से खुश हूं।

ऐसा करने के लिए शायद बेहतर तरीके हैं, लेकिन यह मेरे लिए काम कर रहा है। भविष्य में कोई भी सुझाव अभी भी स्वागत है।

0

जिम गैरीसन (अपडेटेड) उत्तर वह सब है जो आपको चाहिए था। लेकिन आपके द्वारा पोस्ट की गई अद्यतन स्टाइलशीट परिणाम में "नेमस्पेस" विशेषता आउटपुट करती है, इसलिए मुझे यकीन नहीं है कि आप क्या अच्छा करते हैं।

समझने की मुख्य बात यह है कि डिफ़ॉल्ट नामस्थान कैसे काम करता है। Xmlns को उस विशेषता के रूप में न सोचें जिसे आप परिणाम में आउटपुट कर सकते हैं। इसके बजाए, इसे अपने स्टाइलशीट के एक व्याख्यात्मक विवरण के रूप में सोचें, जिसका उद्देश्य इसके नीचे सबकुछ के लिए डिफ़ॉल्ट नामस्थान सेट करना है (तत्व स्वयं और इसके वंशजों में से प्रत्येक को ओवरराइड किए जाने तक)। (बदले में, इसका परिणाम एक्सएमएल में एक ही काम है, जिसमें स्टाइलशीट की तुलना में बहुत अलग संरचना है।)

आपकी स्टाइलशीट में शाब्दिक परिणाम तत्व (उदाहरण के लिए, < संदेश>) साथ ही < xsl: तत्व > निर्देश (उदाहरण के लिए, < xsl: तत्व का नाम = "संदेश">) दोनों डिफ़ॉल्ट नामस्थान पर लेते हैं जब आपूर्ति किए गए नाम उपसर्ग का उपयोग नहीं करते हैं। यदि आप उसी नामस्थान पर सभी चाहते हैं, तो आपको जिम स्टारीशीट के सुझाव के अनुसार, अपनी स्टाइलशीट के शीर्ष पर एक डिफ़ॉल्ट नामस्थान डालना होगा।

अन्यथा, आप कुछ तत्वों है कि उस नाम स्थान है, जिसके कारण परिणाम निहित xmlns = "" (उन तत्वों के लिए नाम स्थान unsetting) में नहीं हैं के साथ खत्म हो जाएगा।

+0

धन्यवाद इवान! मैं यहां आने वाली सभी सहायता की सराहना करता हूं। मैंने पढ़ा कि 'xmlns' एक attrib की तरह दिखता है, लेकिन यह नहीं है। मैं वापस गया और कोड बदल गया ताकि जिम ने सुझाव दिया कि साथ ही साथ नामस्थान क्वालीफायर (शब्दावली?) भी जोड़ा गया ताकि मेरा नेमस्पेस टैग अब मेरी 'स्टाइलशीट' परिभाषा में हो और 'xmlns: grf = "http: //www.blahblah।कॉम "और फिर यह सुनिश्चित करने के लिए वापस चला गया कि मेरे तत्व" grf: "के साथ prefixed हैं। यहां पर आपके विशेषज्ञों की सहायता अमूल्य होने के कारण है क्योंकि मेरी कंपनी के आसपास किसी और ने एक्सएसएलटी या XPATH के साथ बहुत कुछ नहीं किया है। मैं वास्तव में इसे सीखने का आनंद ले रहा हूँ! – AlarmTripper

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