كيف يمكنني السماح تعريف المستخدم تنسيقات ملفات XML?

StackOverflow https://stackoverflow.com/questions/800074

  •  03-07-2019
  •  | 
  •  

سؤال

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

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

هذا هو السهل نسبيا على شكل ملف CSV.المستخدم يقول العنصر الأول خرائط x الميدانية على جانبي العنصر الثاني خرائط 7 الميدانية.... الخ

هذا يحصل أكثر تعقيدا عندما هو تنسيق ملف XML مع العناصر المتداخلة.... الخلا أحد يعرف من واجهة جيدة نموذجا القيام بذلك ؟ أي أمثلة أنا يمكن أن ننظر على شبكة الإنترنت أو في أي مكان آخر ؟ أتصور أن المستخدم يجب أن وصف كامل xpath كجزء من رسم الخرائط ، أو ربما أول تحميل XSD الذي حدد عناصر التعيين (بعد الذي كنت بحاجة إلى توليد XSLT).

وأنا أقدر أي أفكار.

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

المحلول

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

عن طريق "مستقيم إلى الأمام" أعني الأساسية جدا <xsl:apply-templates> النهج.إدخال XML يجب أن السجلات الفردية التي يمكن معالجتها بشكل لا لبس فيه ، تحتوي على جميع البيانات في الشكل الصحيح.لا توجد بيانات يتطلب حساب أو خاصة أخرى لمعالجة أي أكثر تعقيدا من ما يمكن أن يتحقق من خلال تقييم واحد تعبير XPath.

إذا كان الإدخال:

<root>
  <entry id="1" name"foo">
    <data1>somevalue
      <data2>othervalue</data2>
    </data1>
  </entry>
</root>

و الإخراج المطلوب ليكون:

<records>
  <record>
    <id>1</id>
    <name>foo</name>
    <data1>somevalue</data1>
    <data2>othervalue</data2>
  </record>
</records>

ثم أن المستخدم يجب أن توفر ما يلي تعيينات:

  • العنصر الجذر:"الجذر"
  • تسجيل عنصر:"دخول"
  • id:"@id"
  • الاسم:"@اسم"
  • data1:"data1"
  • data2:"data1/data2"

و XSLT سيكون شيئا مثل هذا (القيم في "%" يتم استبداله الفعلية XPath التعبير من فوق تعيين التكوين):

<xsl:template match="/">
  <records>
    <xsl:apply-templates select="%root element%/%record element%" />
  </records>
</xsl:template>

<xsl:template match="%root element%/%record element%">
  <record>
    <id>
      <xsl:value-of select="%id-xpath%[1]" />
    </id>
    <name>
      <xsl:value-of select="%name-xpath%[1]" />
    </name>
    <!-- and so on -->
  </record>
</xsl:template>

نصائح أخرى

إذا فهمت بشكل صحيح, كنت تفكر في واجهة المستخدم بحاجة إلى إنشاء xslt التي تحتاج إليها.أنا جعل افتراض أن هذا هو تطبيق على شبكة الإنترنت.نهج واحد هو استخدام xslt الذي يجعل إدخال xml html (واحد أنا أميل إلى استخدام xmlverbatim).يمكنك تعديل هذا xslt إلى إنشاء ارتباطات إلى العقد.بالإضافة إلى ذلك, يمكنك استخدام بعض xslt لتوليد xpath لهذا العنصر و جعل هذا الجزء من الرابط.يمكنني استخدام هذا (نشرت من قبل Jeni Tennison إلى XSL-قائمة منذ سنوات)

  <xsl:for-each select="ancestor-or-self::*">
    <xsl:text />/<xsl:value-of select="name()" />
    <xsl:text />[<xsl:number />]<xsl:text />
  </xsl:for-each>

بعد ذلك سيكون لديك visual التقديم xml (وليس مثل الآراء التي قدمها MSIE و فايرفوكس) ولكن مع روابط إضافية إلى التطبيق الخاص بك.المستخدمين يمكن ثم حدد العقد من الفائدة.لديهم ثم توفير لكم مع مسارات xpath التي تحتاج إليها دون الحاجة إلى كتابة ذلك بأنفسهم.

توليد xslt إذا كان لديك مسارات xpath هي أسهل بكثير.Tomalek اقتراح أعلاه يبدو طريقة صحيحة.إذا كنت لا تحتاج في الواقع xml كما الناتج النهائي ، قد يكون من الأفضل ببساطة باستخدام محلل xml التي تسمح لك بتحديد العقد نظرا xpath.

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

Altova MapForce هو منتج تجاري على رسم واحد مخطط XML إلى آخر وتوليد تحويل XSL.

قد ترغب في إلقاء نظرة على الإصدار التجريبي ومعرفة كيفية حل هذه المشكلة المعقدة.

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