XSL

2013-09-04 5 views
10

का उपयोग कर मैं इस XML दस्तावेज़ है CDATA से XML रूपांतरण करें:XSL

<ns0:getDataResponse xmlns:ns0="http://abc.com/"> 
    <return> 
     <wrapper> 
      <data><![CDATA[<?xml version="1.0" encoding="UTF-8"?> 
          <ConDic> 
          <dictionary>bank</dictionary> 
           <rows> 
            <row> 
             <bic>ABKZKZKX</bic> 
             <bcode>319</bcode> 
             <name1>AA &quot;A BANK&quot;</namekz> 
             <name2>BB &quot;B BANK&quot;</nameru> 
            </row> 
            <row> 
             <bic>ABNAKZKX</bic> 
             <bcode>922</bcode> 
             <name1>CC &quot;C BANK&quot;</namekz> 
             <name2>DD &quot;D BANK&quot;</nameru> 
            </row> 
           </rows> 
          </ConDic>]]></data> 
     </wrapper> 
    </return> 
</ns0:getDataResponse> 

मैं कैसे चयन इस तरह का बनाने के लिए CDATA में प्रत्येक पंक्तियां प्राप्त करने के लिए XSL के साथ यह पार्स कर सकते हैं:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ns0="http://abc.com/"> 
<xsl:output method="html" /> 
<xsl:template match="text()|@*"/> 
<xsl:template match="ns0:rows"> 

<select name="bank" id="bank" class="input" style="width: 370px;"> 
    <xsl:for-each select="row"> 
     <xsl:sort select="name1"/> 
     <option value="{bic}"><xsl:value-of select="name1" /></option> 
    </xsl:for-each> 
</select> 
+7

कौन सा XSLT प्रोसेसर का उपयोग करते हैं है: उदाहरण के उपयोग XSLT 3.0 सैक्सन 9.5 के साथ (पीई या ई संस्करण की जरूरत है)? आपको 3.0 फ़ंक्शन http://www.w3.org/TR/2013/CR-xpath-functions-30-20130108/#func-parse-xml के साथ एक एक्सएसएलटी 3.0 प्रोसेसर की आवश्यकता है या आपको एक एक्सएसएलटी 1.0 या 2.0 प्रोसेसर समर्थन की आवश्यकता है एक विस्तार समारोह जैसे http://www.saxonica.com/documentation/index.html#!functions/saxon/parse। –

+1

कि बच निकला मार्कअप वैध एक्सएमएल नहीं है। कोई इकाई '"' परिभाषित नहीं है और कोई डीटीडी संदर्भ नहीं है। भले ही आपने सीडीएटीए को अक्षम-आउटपुट-एस्केपिंग के साथ निकालने के लिए पहले पास ट्रांसफॉर्म का उपयोग किया हो, फिर भी आपको अमान्य मार्कअप के साथ छोड़ा जाएगा जो एक्सएमएल के रूप में पार्स नहीं करेगा। इसके अलावा, इसमें एक्सएमएल घोषणा भी शामिल है, जो डीओई ट्रांसफॉर्म में डीटीडी संदर्भ जोड़ने में अधिक कठिन बनाता है। क्या उनके आउटपुट को बदलने के लिए webservice के निर्माता को पाने का कोई तरीका है? –

+1

http://www.w3.org/TR/xml/#sec-predefined-ent 'quot' को परिभाषित करता है इसलिए इसे परिभाषित करने के लिए डीटीडी होना आवश्यक नहीं है। –

उत्तर

0

हैं आपके पास exslt एक्सटेंशन उपलब्ध हैं, आप सामग्री का एक चर बनाने के लिए exslt:node-set का उपयोग करने में सक्षम होना चाहिए। कुछ कोशिश करें (अवांछित):

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:exsl="http://exslt.org/common" 
    extension-element-prefixes="exsl" 
    exclude-result-prefixes="exsl" 
    version="1.0"> 

<xsl:template match="/"> 
    <xsl:variable name="inner" select="exsl:node-set(//data/text())" /> 
    <select name="bank" id="bank" class="input" style="width: 370px;"> 
     <xsl:for-each select="$inner//row"> 
      ... 
     </xsl:for-each> 
    </select> 
</xsl:template> 

</xsl:stylesheet> 
+0

'नोड-सेट()' फ़ंक्शन एक * परिणाम वृक्ष खंड * लेता है और इसे नोड-सेट में परिवर्तित करता है। यह एक स्ट्रिंग नहीं लेगा और इसे नोड-सेट में पार्स करेगा। तो सबसे अच्छा, '$ भीतरी 'का मान केवल एक स्ट्रिंग होगा, और आप' $ आंतरिक // पंक्ति' का चयन करने में सक्षम नहीं होंगे। – LarsH

1

जैसा कि एक टिप्पणी में सुझाव दिया गया है, मैं एक समाधान पोस्ट करता हूं।

<ns0:getDataResponse xmlns:ns0="http://abc.com/"> 
    <return> 
     <wrapper> 
      <data><![CDATA[<?xml version="1.0" encoding="UTF-8"?> 
          <ConDic> 
          <dictionary>bank</dictionary> 
           <rows> 
            <row> 
             <bic>ABKZKZKX</bic> 
             <bcode>319</bcode> 
             <name1>AA &quot;A BANK&quot;</name1> 
             <name2>BB &quot;B BANK&quot;</name2> 
            </row> 
            <row> 
             <bic>ABNAKZKX</bic> 
             <bcode>922</bcode> 
             <name1>CC &quot;C BANK&quot;</name1> 
             <name2>DD &quot;D BANK&quot;</name2> 
            </row> 
           </rows> 
          </ConDic>]]></data> 
     </wrapper> 
    </return> 
</ns0:getDataResponse> 

की एक इनपुट के साथ

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:ns0="http://abc.com/" 
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" exclude-result-prefixes="xs math ns0" 
    version="3.0"> 


    <xsl:output method="html" indent="yes"/> 

    <xsl:template match="text()|@*"/> 

    <xsl:template match="ns0:getDataResponse"> 

     <select name="bank" id="bank" class="input" style="width: 370px;"> 
      <xsl:for-each select="parse-xml(return/wrapper/data)//row"> 
       <xsl:sort select="name1"/> 
       <option value="{bic}"> 
        <xsl:value-of select="name1"/> 
       </option> 
      </xsl:for-each> 
     </select> 
    </xsl:template> 

</xsl:stylesheet> 

परिणाम

<select name="bank" id="bank" class="input" style="width: 370px;"> 
    <option value="ABKZKZKX">AA "A BANK"</option> 
    <option value="ABNAKZKX">CC "C BANK"</option></select> 
संबंधित मुद्दे