ما هي بعض البنيات المفيدة لاستخدام XSLT لإنتاج XSLT؟

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

  •  11-09-2019
  •  | 
  •  

سؤال

لدي ورقة قصص XSLT الحالية التي تأخذ XML وتنتج XHTML تنسيق بشكل جيد. أريد أن أجعل إصدار XSL-FO من هذه الأسلوب لإنتاج PDF عبر Apache FOP. ما أريد أن أعرفه هو:

هل هناك أي مريحة لاستخدام أنماط XSLT أحتاج إلى تعلم أشياء مثل:

  • نسخ بعض العقد دون تغيير
  • نسخ معظم العقدة، ولكن إضافة سمات إضافية

أعلم أنني أستطيع إنشاء عقد جديدة باستخدام

<xsl:element>

ولكن هل هناك أي أشياء مفيدة أخرى سأحتاج إليها. لاحظ أنه على الرغم من أنني لم أفعل الكثير من النسخ من تنسيق XSLT إلى آخر، فقد قمت بعمل طن من XML-> XHTML عبر XSLT لذلك أنا على دراية بمعظم جوهر اللغة.

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

المحلول

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

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <!-- By default, copy all nodes unchanged -->
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- But strip out <foo> elements (including their content) -->
  <xsl:template match="foo"/>

  <!-- For <bar> elements, strip out start & end tags, but leave content --> 
  <xsl:template match="bar">
    <xsl:apply-templates/>
  </xsl:template>

  <!-- For <bat> elements, insert an attribute and append a child --> 
  <xsl:template match="bat">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:attribute name="id">123</xsl:attribute>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

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

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <!-- By default, copy all nodes unchanged -->
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:apply-templates mode="add-atts" select="."/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

          <!-- By default, don't add any attributes -->
          <xsl:template mode="add-atts" match="*"/>

  <!-- For <bat> elements, insert an "id" attribute -->
  <xsl:template mode="add-atts" match="bat">
    <xsl:attribute name="id">123</xsl:attribute>
  </xsl:template>

</xsl:stylesheet>

أخيرا، يمكن إجراء ذلك بشكل أكبر، باستخدام وضع مختلف لكل نوع من التحرير الذي قد ترغب في إجراؤه:

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <!-- For <bat> elements, insert an "id" attribute -->
  <xsl:template mode="add-atts" match="bat">
    <xsl:attribute name="id">123</xsl:attribute>
  </xsl:template>

  <!-- Append <new-element/> to <bat> -->
  <xsl:template mode="append" match="bat">
    <new-element/>
  </xsl:template>

  <!-- Insert an element in <foo> content -->
  <xsl:template mode="insert" match="foo">
    <inserted/>
  </xsl:template>

  <!-- Add content before the <bar/> and <bat/> elements -->
  <xsl:template mode="before" match="bar | bat">
    <before-bat-and-bar/>
  </xsl:template>

  <!-- Add content only after <bat/> -->
  <xsl:template mode="after" match="bat">
    <after-bat/>
  </xsl:template>

  <!-- Here's the boilerplate code -->
  <!-- By default, copy all nodes unchanged -->
  <xsl:template match="@* | node()">
    <xsl:apply-templates mode="before" select="."/>
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:apply-templates mode="add-atts" select="."/>
      <xsl:apply-templates mode="insert" select="."/>
      <xsl:apply-templates/>
      <xsl:apply-templates mode="append" select="."/>
    </xsl:copy>
    <xsl:apply-templates mode="after" select="."/>
  </xsl:template>

          <!-- By default, don't add anything -->
          <xsl:template mode="add-atts" match="*"/>
          <xsl:template mode="insert"   match="*"/>
          <xsl:template mode="append"   match="*"/>
          <xsl:template mode="before"   match="@* | node()"/>
          <xsl:template mode="after"    match="@* | node()"/>

</xsl:stylesheet>

في XSLT 2.0، يمكن تبسيط بعض الغلايات قليلا، وذلك بفضل قواعد قالب الوضع المتعدد:

          <!-- By default, don't add anything -->
          <xsl:template mode="add-atts
                              insert
                              append
                              before
                              after" match="@* | node()"/>

أحيانا استخدم كل هذه الأوضائف المخصصة في نفس الأنماط، ولكن في كثير من الأحيان ألا أضيفها كضوء - حسب الحاجة.

نصائح أخرى

أكبر عقبة أمام تحويل XSLT هي أن بادئة مساحة الاسم الإخراج هي نفسها مثل تعليمات XSL الفعلية في تحويلك. إذا كنت تستخدم "XSL:" "في تعليمات XSL الخاصة بك وإخراجك، فلن يعرف محرك XSLT الخاص بك الفرق بين تعليمات XSL التي يجب تنفيذها وأولئك يجب إخراجها، لذلك لن تحليل XSLT الخاص بك. وهذا هو، إلا إذا كنت تستخدم اسم مستعار مساحة الاسم:

<xsl:namespace-alias stylesheet-prefix="x" result-prefix="xsl"/>

هذه التعليمات، التي وضعت داخل <xsl:stylesheet />, ، يسمح لك بكتابة علامات النتيجة الخاصة بك في التحويل باستخدام بادئة مساحة اسم بديلة. في وقت لاحق، عند إنشاء مستند الإخراج، سيتم إدراج البادئة التي تريدها بالفعل في مكان الاسم المستعار. لذلك، على سبيل المثال، إليك قالب ينتج قالب في مستند الإخراج:

<xsl:template match="xsl:template[@match='title']>
   <x:template match="title>
      <x:apply-templates />
   </x:template>
</xsl:template>

إليك مقالة جيدة: http://www.xml.com/pub/a/2001/04/04/trxml /

في الماضي، قمت بتطوير أوراق XSL-FO أنماط ثم استخدمت Render-X Fo2html StyleSheet لتحويل XSL-FO في HTML. انها تحولت <block> عناصر في <div>, <inline> إلى <span>, ، إلخ.

أنا لم أستخدمها من قبل، لكنك قد تفكر في المحاولة HTML2FO أنماط والأوراق المالية. وبعد أو على الأقل يبحثون عنها لاقتراض بعض الأفكار.

نظرا لأن HTML يفتقر إلى بعض بنيات الصفحات التي تنص على أنها قد لا تعطيك كل ما تحتاجه لإخراج XSL-FO الخاص بك، ولكن ربما يتعامل مع غالبية منطق التحويل من HTML إلى عنصر / سمات XSL-FO في هيئة الوثيقة.

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