2008-09-17 8 views
6

जैसे कुछ hierachical एक्सएमएल को बदलने के लिए एक सामान्य तरीका होना चाहिए:HTML तालिका करने के लिए XML फ़्लैट

<element1 A="AValue" B="BValue"> 
    <element2 C="DValue" D="CValue"> 
     <element3 E="EValue1" F="FValue1"/> 
     <element3 E="EValue2" F="FValue2"/> 
    </element2> 
    ... 
</element1> 
चपटी एक्सएमएल (html) में

रास्ते चयनित विशेषताओं उठा और विशेषताओं के लिए विभिन्न लेबल प्रदान जो कॉलम हेडर बन जाते हैं।

<table> 
    <tr> 
    <th>A_Label</th> 
    <th>D_Label</th> 
    <th>E_Label</th> 
    <th>F_Label</th> 
    </tr> 
    <tr> 
    <td>AValue</td> 
    <td>DValue</td> 
    <td>EValue1</td> 
    <td>FValue1</td> 
    </tr> 
    <tr> 
    <td>AValue</td> 
    <td>DValue</td> 
    <td>EValue2</td> 
    <td>FValue2</td> 
    </tr> 
<table> 

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

उत्तर

5

मैं 100% तुम क्या करने कोशिश कर रहे हैं के बारे में सुनिश्चित नहीं कर रहा हूँ, लेकिन अगर आपके element1, element2 और element3 लगातार नेस्टेड रहते हैं इस समाधान काम कर सकते हैं।

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="element3"> 
     <tr> 
      <td><xsl:value-of select="../../@A"/></td> 
      <td><xsl:value-of select="../../@B"/></td> 
      <td><xsl:value-of select="../@C"/></td> 
      <td><xsl:value-of select="../@D"/></td> 
      <td><xsl:value-of select="@E"/></td> 
      <td><xsl:value-of select="@F"/></td> 
     </tr> 
     <xsl:apply-templates select="*"></xsl:apply-templates> 
    </xsl:template> 

</xsl:stylesheet> 
+0

धन्यवाद Darrel। शानदार काम करता है। –

+0

अच्छा नमूना। धन्यवाद! – chrismead

0

हमारे पास पहले से ही एक ओरेकल डेटाबेस से एक प्रो * सी प्रोग्राम पढ़ना है, यह एक पर्ल स्क्रिप्ट कहता है जो बदले में कुछ जावा को निष्पादित करता है ताकि बैच फ़ाइल को कुछ vbscript एफ़टीपी निष्पादित करने के लिए उपरोक्त डेटाबेस से एक्सएमएल प्रारूप में डेटा निकाला जा सके। किसी अन्य सर्वर पर फ़ाइल करें। मैं वास्तव में फोरट्रान में कुछ की उम्मीद कर रहा था।

+0

वाह ... मैं जब तक मैं fortran हिस्सा मिल गया सोचा कि आप एक सेकंड के लिए गंभीर थे – davr

0

मूल प्रश्न स्पष्ट किया जाना चाहिए:

  • क्या मूल प्रश्न में BValue और CValue साथ क्या होता है? क्या कोई कारण है कि उन्हें चपटे ढांचे का हिस्सा नहीं बनना चाहिए?
  • क्या एक्सएमएल दस्तावेज़ में सभी तत्वों में 2 विशेषताएं हैं या क्या यह पूरी तरह से मनमानी है?
  • क्या केवल 3 प्रकार के तत्व हैं और क्या वे उदाहरण में दिखाए गए अनुसार हमेशा घोंसला रखते हैं?
  • क्या आपका तत्व 1 स्वयं को दोहराया जा सकता है या यह आपके दस्तावेज़ का मूल तत्व है?

एक्सएसएलटी में बहुत सामान्य ट्रांसफार्मर लिखना संभव है लेकिन किसी दस्तावेज़ को बदलने के लिए स्टाइलशीट लिखना अक्सर आसान होता है जब आप किसी भी ज्ञात प्रतिबंध को खाते में ले सकते हैं।

0

मैंने संरचित XML को फ़्लैट करने के लिए नीचे दिए गए टेम्पलेट का विस्तृत संस्करण उपयोग किया है। चेतावनी: मूल संस्करण में कुछ केस-विशिष्ट कोड था (यह वास्तव में एक्सएमएल को सीएसवी में बदल गया) जिसे मैंने अभी हटा दिया और मैंने इस संस्करण का परीक्षण नहीं किया।

बुनियादी तरीका यह काम करता है स्पष्ट किया जाना चाहिए: यह सब कुछ नोड बच्चे हैं यह नहीं है कि और नहीं तो रिकर्सिवली नोड() बच्चों है कि पर टेम्पलेट कॉल प्रिंट करता है। मुझे नहीं लगता कि यह अब गुणों और टिप्पणियों को सही तरीके से संभालता है, लेकिन इसे ठीक करना मुश्किल नहीं होना चाहिए।

<?xml version="1.0" encoding="UTF-8"?> 

<!-- XSL template to flatten structured XML, before converting to CSV. --> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes" encoding="UTF-8"/> 

    <xsl:strip-space elements="*" /> 

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

    <xsl:template match="//yourElementsToFlatten"> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:choose> 
      <!-- If the element has multiple childs, call this template 
       on its children to flatten it--> 
      <xsl:when test="count(child::*) > 0"> 
       <xsl:apply-templates select="@*|node()"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:copy> 
        <xsl:value-of select="text()" /> 
       </xsl:copy> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet> 
1

मुझे एक समान एक्सएसएलटी की आवश्यकता है लेकिन अज्ञात गहराई के साथ, मैंने यह कैसे किया है।

पहले, जिसके परिणामस्वरूप HTML तालिका/डीईएफ़ सूची और कॉल टेम्पलेट मोड = "उल्टी" हमारे एक्सएमएल पेड़ समतल के लिए एक आवरण जोड़ें:

<xsl:element name="div"> 
    <xsl:attribute name="class" select="puke" /> 
    <xsl:apply-templates select="$notice" mode="puke" /> 
</xsl:element> 

यहाँ हम अपनी सामग्री प्रदर्शित करने के लिए प्रत्येक नोड से मेल खाते हैं (उदाहरण के लिए पाठ()) और इसके गुण। हम इसे बार-बार करते हैं। मैंने डीएल/डीटी/डीडी का इस्तेमाल किया क्योंकि मेरा स्रोत पेड़ एक जटिल पेड़ था जिसे एक के रूप में नहीं बनाया जा सकता था।

<!-- @description: 
    Display all field from the notice so the customer can tell what he want 
--> 
<xsl:template match="node()" mode="puke"> 
<xsl:message> 
    puking : <xsl:value-of select="local-name(.)" /> 
</xsl:message> 
    <xsl:element name="dl"> 
     <xsl:element name="dt"> 
      <xsl:attribute name="class">tagName</xsl:attribute> 
      <xsl:value-of select="local-name(.)" /> 
     </xsl:element> 
     <xsl:element name="dd"> 
      <xsl:attribute name="class">tagText</xsl:attribute> 
      <xsl:value-of select="text()" /></xsl:element> 
     <xsl:element name="dl"> 
      <xsl:attribute name="class">attr</xsl:attribute> 
      <!-- display attribute --> 
      <xsl:apply-templates select="@*" /> 
     </xsl:element> 
    </xsl:element> 
    <!-- recursive call on node() --> 
    <xsl:apply-templates select="./*" mode="puke" />  
</xsl:template> 

किसी दिए गए नोड का मिलान गुण और उन्हें प्रदर्शित करें।

सीएसएस जिसके परिणामस्वरूप HTML स्वरूप में उपयोग करें:

<style> 
.puke { 
    background-color: #BDD6DE; 
    clear: both; 
} 
.tagName, .attrName { 
    float: left; 
} 
.tagText, .attrText { 
    clear: right; 
} 
</style> 
संबंधित मुद्दे