تحويل الهوية

التحويل المطابق هو تحويل للبيانات يقوم بنسخ بيانات المصدر إلى بيانات الوجهة دون تغيير.

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

أمثلة على التحويلات التكرارية

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

استخدام XSLT

أكثر الأمثلة شيوعًا لتحويل الهوية (لإصدار XSLT 1.0) هو تحويل "copy.xsl" كما هو مُعبَّر عنه في XSLT . يستخدم هذا التحويل الأمر xsl:copy [ 1 ] لإجراء تحويل الهوية:

<xsl:stylesheet version= "1.0" xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" > <xsl:template match= "@*|node()" > <xsl:copy> <xsl:apply-templates select= "@*|node()" /> </xsl:copy> </xsl:template> </xsl:stylesheet>

يعمل هذا القالب عن طريق مطابقة جميع السمات ( @* ) والعُقد الأخرى ( node() )، ثم نسخ كل عُقدة مُطابقة، وتطبيق تحويل الهوية على جميع السمات والعُقد الفرعية لعُقدة السياق. يؤدي هذا إلى انحدار شجرة العناصر بشكل متكرر، وإخراج جميع البنى بنفس البنية التي وُجدت بها في الملف الأصلي، ضمن حدود المعلومات التي تُعتبر مهمة في نموذج بيانات XPath . وبما أن node() تُطابق النصوص، وتعليمات المعالجة، والجذر، والتعليقات، بالإضافة إلى العناصر، فإنه يتم نسخ جميع عُقد XML.

النسخة الأكثر وضوحًا من تحويل الهوية هي:

<xsl:stylesheet version= "1.0" xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" > <xsl:template match= "@*|*|processing-instruction()|comment()" > <xsl:copy> <xsl:apply-templates select= "*|@*|text()|processing-instruction()|comment()" /> </xsl:copy> </xsl:template> </xsl:stylesheet>

هذا الإصدار مكافئ للإصدار الأول، ولكنه يُفصّل أنواع عُقد XML التي سيتم نسخها. كلا الإصدارين ينسخان بيانات غير ضرورية لمعظم استخدامات XML (مثل التعليقات).

XSLT 3.0

تحدد XSLT 3.0 [ 2 ] سمة "on-no-match" للتعليمات، xsl:modeوالتي تسمح بتعريف تحويل الهوية بدلاً من تنفيذه كقاعدة قالب صريحة. تحديداً:

<xsl:stylesheet version= "3.0" xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" > <xsl:mode on-no-match= "shallow-copy" /> </xsl:stylesheet>

وهي مكافئة بشكل أساسي لقواعد القوالب السابقة. راجع وصف النسخ السطحي في معيار XSLT 3.0 [ 3 ] لمزيد من التفاصيل.

أخيرًا، تجدر الإشارة إلى أن تفاصيل الترميز، مثل استخدام أقسام CDATA أو ترتيب السمات، لا تُحفظ بالضرورة في المخرجات، لأن هذه المعلومات ليست جزءًا من نموذج بيانات XPath . لعرض ترميز CDATA في المخرجات، يجب أن تستخدم ورقة أنماط XSLT التي تحتوي على قالب تحويل الهوية ( وليسxsl:output قالب تحويل الهوية نفسه) السمة المسماة cdata-section-elements.

cdata-section-elementsيحدد قائمة بأسماء العناصر التي يجب إخراج عناصرها النصية الفرعية باستخدام أقسام CDATA. [ 1 ] على سبيل المثال:

<xsl:output method= "xml" encoding= "utf-8" cdata-section-elements= "element-name-1 element-name-2" />

استخدام XQuery

يمكن لـ XQuery تعريف الدوال التكرارية. تقوم دالة XQuery التالية بنسخ المدخلات مباشرةً إلى المخرجات دون تعديل.

declare function local:copy ( $ element as element ()) { element { node-name ( $ element )} { $ element / @* , for $ child in $ element / node () return if ( $ child instance of element ()) then local:copy ( $ child ) else $ child } };

ويمكن تحقيق نفس الوظيفة باستخدام تحويل من نوع تبديل الأنواع.

إصدار xquery "1.0" ؛( : نسخ المدخلات إلى المخرجات دون تعديل :) ...(: إخراج كل سمة في هذا العنصر :) for $ att in $ node / @* return attribute { name ( $ att ) } { $ att } , (: إخراج جميع العناصر الفرعية لهذا العنصر بشكل متكرر :) for $ child in $ node return local:copy ( $ child / node ())} (: وإلا مررها كما هي. تُستخدم للنصوص والتعليقات والبيانات الأولية :) القيمة الافتراضية هي إرجاع $ node };

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

التحويلات غير المتكررة

تحويلان بسيطان وتوضيحيان لـ "نسخ الكل".

استخدام XSLT

<xsl:stylesheet version= "1.0" xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" > <xsl:template match= "/" > <xsl:copy-of select= "." /> </xsl:template> </xsl:stylesheet>

استخدام XProc

<p:pipeline name= "pipeline" xmlns:p= "http://www.w3.org/ns/xproc" > <p:identity/> </p:pipeline>

وهنا ملاحظة مهمة حول هوية XProc ، وهي أنها يمكن أن تأخذ إما مستندًا واحدًا مثل هذا المثال أو سلسلة من المستندات كمدخلات.

أمثلة أكثر تعقيدًا

بشكل عام، يتم استخدام تحويل الهوية كأساس يمكن من خلاله إجراء تعديلات محلية.

إزالة تحويل العنصر المسمى

استخدام XSLT

يمكن تعديل عملية التحويل التطابقي لنسخ كل شيء من شجرة الإدخال إلى شجرة الإخراج باستثناء عقدة معينة. على سبيل المثال، سينسخ ما يلي كل شيء من الإدخال إلى الإخراج باستثناء رقم الضمان الاجتماعي:

<xsl:template match= "@*|node()" > <xsl:copy> <xsl:apply-templates select= "@*|node()" /> </xsl:copy> </xsl:template><!-- إزالة جميع أرقام الضمان الاجتماعي --> <xsl:template match= "PersonSSNID" />

استخدام XQuery

declare function local:copy-filter-elements ( $ element as element (), $ element-name as xs:string * ) as element () { element { node-name ( $ element ) } { $ element / @* , for $ child in $ element / node ()[ not ( name (.) = $ element-name )] return if ( $ child instanceof element ( ) ) then local : copy - filter - elements ( $ child , $ element - name ) else $ child } } ;

إن تسمية هذا بواحدة سيضيف ما يلي:

$ filtered-output := local:copy-filter-elements ( $ input , 'PersonSSNID' )

استخدام XProc

<p:pipeline name= "pipeline" xmlns:p= "http://www.w3.org/ns/xproc" > <p:identity/> <p:delete match= "PersonSSNID" /> </p:pipeline>

انظر أيضاً

للمزيد من القراءة

  • كتاب طبخ XSLT ، دار نشر أورايلي ميديا، 1 ديسمبر 2002، بقلم سال مانجانو، رقم ISBN 0-596-00372-2
  • بريسيلا والمسلي، إكس كويري ، دار نشر أورايلي ميديا، الفصل الثامن: الدوال - الدوال التكرارية - الصفحة 109

مراجع