سؤال

أقوم بانتظام بإنشاء مخطط XSD عن طريق تحويل نموذج بيانات خاص لنظام قديم.هذا يعمل بشكل جيد جدا.ومع ذلك، فإن النظام القديم يسمح لي فقط بتحديد سمات أساسية جدًا للمعلمة، مثل نوع البيانات (int, string إلخ.).

أرغب في تحسين تحويل XSL بآلية تسمح لي بإضافة بيانات التعريف لتوفير المزيد من التفاصيل للتحويل.لقد فكرت في شيء مثل تدوين خصائص Java لتعيين سمات إلى XPath.

تخيل المثال التالي:

نموذج بيانات النظام القديم (في الواقع هذا أنيق، ولكن الأنسب لأغراض العرض التوضيحي)

<datamodel>
  <customer>
    <firstName type="string"/>
    <lastName type="string"/>
    <age type="int">
  <customer>
</datamodel>

البيانات الوصفية

customer/firstName/@nillable=false
customer/lastName/@nillable=false
customer/age/@nillable=true
customer/firstName/@minOccurs=1
customer/firstName/@maxOccurs=1
customer/lastName/@minOccurs=1
customer/lastName/@maxOccurs=1

مخطط XSD الناتج

...
<xs:complexType name="customerType">
  <xs:sequence>
    <xs:element name="firstName" type="xs:string" nillable="false" minOccurs="1" maxOccurs="1"/>
    <xs:element name="lastName" type="xs:string" nillable="false" minOccurs="1" maxOccurs="1"/>
    <xs:element name="age" type="xs:int" nillable="true"/>
  </xs:sequence>
</xs:complexType>
...

ما رأيك في ذلك؟هل هناك طريقة لتضمين بيانات التعريف في ورقة أنماط XSL؟

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

المحلول

سيكون الحل الأفضل هو تعديل البيانات القديمة عن طريق إضافة بيانات التعريف المفقودة.

مثال على مفردات "نموذج البيانات" المعدلة قد يكون مثل هذا:

<datamodel xmlns:nm="my:new.meta">
    <customer>
        <firstName type="string"
                   nm:nillable="false"
                   nm:minOccurs="1"
                   nm:maxOccurs="1"
                   />
        <lastName type="string"
                  nm:nillable="false"
                  nm:minOccurs="1"
                  nm:maxOccurs="1"
                  />
        <age type="int" nm:nillable="true"/>
    </customer>
</datamodel>

يعد وضع الخصائص الجديدة في مساحة اسم منفصلة طريقة جيدة لتمييزها بسهولة عن الخصائص المدعومة بالفعل.عادةً لا يُنصح باستخدام السمات في مساحة الاسم، لذا إذا أردنا تجنب ذلك، فيمكن استخدام العناصر الفرعية (التي تنتمي إلى مساحة الاسم الجديدة) بدلاً من السمات.قد يؤدي جعل السمات الجديدة تنتمي إلى مساحة اسم مختلفة إلى عدم رفض التحقق من صحة المخطط القديم.

إذا لم يكن من الممكن تعديل البيانات القديمة لبعض الأسباب، فإنني أوصي بعدم تضمين الخصائص الجديدة في ورقة أنماط XSLT نفسها (وهذا ممكن تمامًا، على سبيل المثال تعريف هذا على أنه محتويات ملف عام <xsl:variable>)، ولكن لتوفير هذه الخصائص الجديدة كملف XML منفصل أو كمجموعة من ملفات XML واحدة أو أكثر.

يمكن الوصول إلى أي ملف XML ديناميكيًا أثناء تحويل XSLT باستخدام الدالة XSLT document().قد يبدو مثيل ملف XML بالخصائص الجديدة كما يلي:

<newProperties xmlns:nm="my:new.meta">
    <customer>
        <firstName nm:nillable="false"
                   nm:minOccurs="1"
                   nm:maxOccurs="1"
                   />
        <lastName nm:nillable="false"
                  nm:minOccurs="1"
                  nm:maxOccurs="1"
                  />
        <age nm:nillable="true"/>
    </customer>
</newProperties>

نأمل أن يكون هذا ساعد.

هتافات،

ديميتري نوفاتشيف

نصائح أخرى

"ما رأيك في ذلك؟"

اثنينثلاثة أشياء.

  1. إصلاح البيانات الوصفية القديمة.انها XML.أضف أشياء إليها.أضف مساحة اسم إذا كان عليك ذلك.

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

  3. فكر في استخدام XML لبيانات التعريف الإضافية، وليس XPath الزائف.سيساعد الاتساق من يأتي بعدك على معرفة ما يحدث.

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