البرنامج النصي لإعادة إصلاح ملف XML
سؤال
أحاول تغيير ملف 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>
سيتم وضعه من خلال القالب.