سؤال

أحاول تغيير ملف XML من تنسيق إلى آخر وليس لدي أدنى فكرة عن كيفية كتابة نص له. هل يمكن لأحد أن يساعد ، من فضلك؟
يبدو الملف المصدر هكذا:

<Record>
     <FieldValue fieldName="rapportage_nihil" fieldValue="false" fieldValueIsNull="false" fieldValueNatural="false"/>
     <FieldValue fieldName="periode" fieldValue="2009-23-31" fieldValueIsNull="false" fieldValueNatural="2009-10-31 00:23:23"/>
     <FieldValue fieldName="formulierid" fieldValue="9001HK1V10" fieldValueIsNull="false" fieldValueNatural="9001HK1V10"/>
     <FieldValue fieldName="versie" fieldValue="1" fieldValueIsNull="false" fieldValueNatural="1"/>
     <FieldValue fieldName="frequentie" fieldValue="M" fieldValueIsNull="false" fieldValueNatural="M"/>
     <FieldValue fieldName="variant_type" fieldValue="Landen" fieldValueIsNull="false" fieldValueNatural="Landen"/>
     <FieldValue fieldName="value" fieldValue="5F" fieldValueIsNull="false" fieldValueNatural="5F"/>
     <FieldValue fieldName="post_value" fieldValue="0.00" fieldValueIsNull="false" fieldValueNatural="1.037E-4"/>
     <FieldValue fieldName="cube" fieldValue="c01" fieldValueIsNull="false" fieldValueNatural="c01"/>
     <FieldValue fieldName="rij" fieldValue="r_24_100_1_000_0" fieldValueIsNull="false" fieldValueNatural="r_24_100_1_000_0"/>
     <FieldValue fieldName="kolom" fieldValue="c_2250_SPU" fieldValueIsNull="false" fieldValueNatural="c_2250_SPU"/>
</Record>
<Record>
     <FieldValue fieldName="rapportage_nihil" fieldValue="false" fieldValueIsNull="false" fieldValueNatural="false"/>
     <FieldValue fieldName="periode" fieldValue="2009-23-31" fieldValueIsNull="false" fieldValueNatural="2009-10-31 00:23:23"/>
     <FieldValue fieldName="formulierid" fieldValue="9001HK1V10" fieldValueIsNull="false" fieldValueNatural="9001HK1V10"/>
     <FieldValue fieldName="versie" fieldValue="1" fieldValueIsNull="false" fieldValueNatural="1"/>
     <FieldValue fieldName="frequentie" fieldValue="M" fieldValueIsNull="false" fieldValueNatural="M"/>
     <FieldValue fieldName="variant_type" fieldValue="Landen" fieldValueIsNull="false" fieldValueNatural="Landen"/>
     <FieldValue fieldName="value" fieldValue="5F" fieldValueIsNull="false" fieldValueNatural="5F"/>
     <FieldValue fieldName="post_value" fieldValue="0.00" fieldValueIsNull="false" fieldValueNatural="1.037E-4"/>
     <FieldValue fieldName="cube" fieldValue="c01" fieldValueIsNull="false" fieldValueNatural="c01"/>
     <FieldValue fieldName="rij" fieldValue="r_24_108_0_000_0" fieldValueIsNull="false" fieldValueNatural="r_24_108_0_000_0"/>
     <FieldValue fieldName="kolom" fieldValue="c_2250_SPU" fieldValueIsNull="false" fieldValueNatural="c_2250_SPU"/>
</Record>
<Record>
    <FieldValue fieldName="rapportage_nihil" fieldValue="false" fieldValueIsNull="false" fieldValueNatural="false"/>
    <FieldValue fieldName="periode" fieldValue="2009-23-31" fieldValueIsNull="false" fieldValueNatural="2009-10-31 00:23:23"/>
    <FieldValue fieldName="formulierid" fieldValue="9001HK1V10" fieldValueIsNull="false" fieldValueNatural="9001HK1V10"/>
    <FieldValue fieldName="versie" fieldValue="1" fieldValueIsNull="false" fieldValueNatural="1"/>
    <FieldValue fieldName="frequentie" fieldValue="M" fieldValueIsNull="false" fieldValueNatural="M"/>
    <FieldValue fieldName="variant_type" fieldValue="Landen" fieldValueIsNull="false" fieldValueNatural="Landen"/>
    <FieldValue fieldName="value" fieldValue="5F" fieldValueIsNull="false" fieldValueNatural="5F"/>
    <FieldValue fieldName="post_value" fieldValue="0.00" fieldValueIsNull="false" fieldValueNatural="1.6049E-4"/>
    <FieldValue fieldName="cube" fieldValue="c01" fieldValueIsNull="false" fieldValueNatural="c01"/>
    <FieldValue fieldName="rij" fieldValue="r_06_000_1_010_0" fieldValueIsNull="false" fieldValueNatural="r_06_000_1_010_0"/>
    <FieldValue fieldName="kolom" fieldValue="c_2250_SPU" fieldValueIsNull="false" fieldValueNatural="c_2250_SPU"/>
</Record>

هذا هو التنسيق الذي أحتاجه كنتيجة:

<bestand registratienummer="123">
<rapportage nihil="false" periode="2009-23-31" formulierid="9001HK1V10" versie="1" frequentie="M">
        <variant type="Landen" value="5F" />
        <post value="0.00" cube="c01" rij="r_24_100_1_000_0" kolom="c_2250_SPU" />
</rapportage>
<rapportage nihil="false" periode="2009-23-31" formulierid="9001HK1V10" versie="1" frequentie="M">
        <variant type="Landen" value="5F" />
        <post value="0.00" cube="c01" rij="r_24_108_0_000_0" kolom="c_2250_SPU" />
</rapportage>
<rapportage nihil="false" periode="2009-23-31" formulierid="9001HK1V10" versie="1" frequentie="M">
        <variant type="Landen" value="5F" />
        <post value="0.00" cube="c01" rij="r_06_000_1_010_0" kolom="c_2250_SPU" />
</rapportage>
</bestand>  

شكرا جزيلا!

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

المحلول

يتم صنع XSLT لهذا الغرض بالضبط. يمكنك تحويل أي ملف XML محدد جيدًا إلى أي تنسيق آخر للنص العادي ، بما في ذلك بنية XML مختلفة. احصل على مثل XSLTProc ، اكتب نصًا وإنكتك.

إذا كنت بحاجة إلى تعلم XSLT أولاً ، فإليك نقطة انطلاق جيدة: http://www.w3schools.com/xsl/ (يعطي هذا البرنامج التعليمي أمثلة للتحول إلى XHTML ، ولكن عليك فقط استخدام علامات XML المستهدفة بدلاً من علامات XHTML ...).

قد يكون هذا نصًا جيدًا للبدء من (آسف ، لكن ليس لدي وقت لإعطائك نصًا بالكامل هنا):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:output method="xml" encoding="utf-8" />
    <xsl:template match="/">
        <bestand registratienummer="123">
            <apply-templates select="//Record"/>
        </bestand>
    </xsl:template>
    <xsl:template match="Record">
        <xsl:variable name="nihil" select="FieldValue[@fieldName='rapportage_nihil']/@fieldValue"/>
        <!-- add more variable lookups here. you need XPath for that. -->
        <rapportage nihil="{$nihil}" periode="{$periode}">
            <!-- add more output here -->
        </rapportage>
    </xsl:template>
</xsl:stylesheet>

يمكنك إعطاء XSLTPROC ورقة الأنماط هذه ومستند XML المصدر الخاص بك ، وسوف تعطيك ملف XML الجديد. ربما تحتاج إلى التأكد واحد عنصر الجذر. لا يبدو مثالك كما لو أنه يحتوي على واحد ، فقد تحتاج إلى تحيطه بعنصر تعسفي.

لتوضيح بعض الشيء على XSLT والنص: تخيل أن لديك مؤشران. واحد في البرنامج النصي XSLT ، واحد في ملف مصدر XML الخاص بك. XSLT هو كل شيء عن "تطبيق القوالب" وسيستخدم دائمًا القالب الذي هو أقرب مباراة (فكر في القوالب كنوع من الوظائف).

في البداية ، ستكون أقرب مباراة هي العنصر الجذر ، لذلك سيبدأ مؤشر XSLT في القالب match="/". مؤشر XML موجود في عنصر الجذر (الاسم المستعار "علامة") لمستند مصدر XML. أي عنصر ليس بدءا من xsl: سوف يعتبر عنصر الإخراج. لذلك ، أولاً وقبل كل شيء ، سوف يخرج XSLTProc <bestand> عنصر.

ثم يذهب مؤشر XSLT إلى أبعد من ذلك ويجد <apply-templates> اختيار جميع العناصر المطابقة //Record (يدل المائل المزدوج على "في أي عمق"). لكل <Record> العنصر ، سوف "يطلق" قالب المطابقة. هنا ستكون أقرب مباراة <xsl:template match="Record">.

لذا فإن مؤشر XSLT سيقفز إلى القالب ، مؤشر XML إلى الأول <Record>. ثم متغير (nihil) تم الإعلان عنه ، يحتوي على بعض المعلومات من السجل المحدد من مؤشر XML فصاعدًا أعمق في بنية XML لمستند المصدر باستخدام تعبير XPath. يقول تعبير XPath: "اختر من العنصر FieldValue التي لها سمة fieldName مع القيمة 'rapportage_nihil' قيمة السمة fieldValue"(فكر في الأمر مثل SQL حيث يتم بند بيانات XML ؛ السمات مسبقة هنا @).

تحتاج إلى نسخ ولصق وتغيير هذا الخط لكل المعلومات التي تحتاجها في مستند الإخراج الخاص بك. ثم عنصر الإخراج <rapportage> يتم تقييمه ، استبدال كل متغير (على سبيل المثال {$nihil}) مع قيمها المذكورة أعلاه مع <xsl:variable>. تحتاج إلى إضافة العناصر داخل <rapportage> العنصر بنفس الطريقة مثل <rapportage> عنصر. ثم يكون القالب في نهايته والآخر <Record> سيتم وضعه من خلال القالب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top