سؤال

يجب أن يكون هناك generic طريقة لتحويل بعض hierachical XML مثل:

<element1 A="AValue" B="BValue">
   <element2 C="DValue" D="CValue">
      <element3 E="EValue1" F="FValue1"/>
      <element3 E="EValue2" F="FValue2"/>
   </element2>
   ...
</element1>

إلى بالارض XML (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>

حسنا, لذلك ليس هناك generic الحل بسبب السمة إعادة وضع العلامات ولكن تحصل على ما أعني أمل.لقد بدأت للتو في كل XSLT/XPATH الاشياء لذا سأعمل بها في الوقت المناسب ولكن أي أدلة من شأنها أن تكون مفيدة.

هل كانت مفيدة؟

المحلول

أنا لست متأكدا 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>

نصائح أخرى

أنا في حاجة مماثلة XSLT ولكن مع عمق غير معروف ، هنا هو كيف فعلت ذلك.

أولا ، إضافة المجمع عن جدول HTML/صفر القائمة استدعاء قالب النمط="تقيؤ" لشد لدينا شجرة XML :

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

نحن هنا مباراة كل عقدة لعرض المحتوى (على سبيل المثالالنص()) و خصائصه.ونحن نفعل ذلك بشكل متكرر.اعتدت dl/dt/dd لأن المصدر شجرة معقدة الشجرة التي لا يمكن أن تتسطح كما .

<!-- @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>

مباراة سمة من عقدة معينة وعرضها.

CSS تستخدم في تنسيق الناتجة HTML :

<style>
.puke {
    background-color: #BDD6DE;
    clear: both;
}
.tagName, .attrName {
    float: left;
}
.tagText, .attrText {
    clear: right;
}
</style>

لدينا بالفعل برو*برنامج C القراءة من قاعدة بيانات Oracle ، فإنه يدعو perl والذي بدوره ينفذ بعض جافا لاستخراج البيانات في تنسيق XML من المذكور بيانات الإتصال ملف دفعي إلى تنفيذ بعض vbscript FTPing الملف إلى ملقم.كنت آمل حقا لشيء في Fortran.

السؤال الأصلي يحتاج إلى توضيح:

  • ما يحدث مع BValue و الخاصة بك في النص الأصلي السؤال ؟ هل هناك سبب لماذا لا ينبغي أن تكون جزءا من بالارض هيكل ؟
  • هل كل من عناصر XML دوك 2 أو سمات هذا تعسفية تماما?
  • هناك فقط 3 أنواع من العناصر و هم دائما متداخلة كما هو مبين في المثال ؟
  • يمكن element1 تتكرر نفسها أو هذا العنصر الجذر الخاص بك دكتور ؟

في XSLT من الممكن كتابة عامة جدا المحولات ولكن غالبا ما يكون أسهل بكثير من كتابة الأنماط لتحويل الوثيقة عندما يمكنك أن تأخذ أي قيود معروفة في الاعتبار.

لقد استخدمت نسخة موسعة من القالب أدناه لشد منظم XML.تحذير:كان هناك بعض الحالات الخاصة البرمجية في النسخة الأصلية (في الحقيقة تحولت XML إلى CSV) أنني جردت و لم أكن اختبار هذا الإصدار.

الطريقة الأساسية التي يعمل بها يجب أن يكون واضحا:فإنه يطبع كل شيء الذي لا يملك عقدة الأطفال وغير ذلك يدعو بشكل متكرر القالب على العقدة() أن لا يكون الأطفال.أنا لا أعتقد أنه يتعامل مع سمات التعليقات بشكل صحيح كما هو عليه الآن, ولكن هذا لا ينبغي أن يكون من الصعب إصلاحها.

<?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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top