نمط عرض خطوتين: XSLT مقابل الرسم البياني الكائن

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

  •  06-07-2019
  •  | 
  •  

سؤال

أنوي تنفيذ مارتن فاولر نمط عرض من خطوتينلتقديم HTML في تطبيق ويب أنا أكتب. الفكرة العامة هي أنه بدلاً من الحصول على HTML RAW HTML ، فإنه يخرج XML وسيط مخصص يتم تحويله بعد ذلك إلى HTML/CSS. هذا له عدد من المزايا بما في ذلك انخفاض تكرار التعليمات البرمجية وإخراج أكثر اتساقًا.

النهج الذي اقترحه Fowler لتحويل XML إلى HTML النهائي هو استخدام XSLT.

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

فيما يلي مثال على إخراج XML لخطوة التقديم الأولى:

<grid>
   <headingRow>
      <cell>Product</cell>
      <cell>Price</cell>
   </headingRow>
   <row>
      <cell>A product</cell>
      <cell type="price">$54.95</cell>
   </row>
</grid>

والإخراج HTML النهائي المطلوب:

<table class="grid">
  <tr>
    <th>Product</th>
    <th>Price</th>
  </tr>
  <tr>
    <td>A product</td>
    <td>
      <span class="currency_symbol">$</span>
      <span class="decimal_number">54.95</span>
    </td>
  </tr>
</table>

النهج الذي أفكر فيه سيكون له كائن واحد لكل علامة.

class GridTag extends Tag {
  ...
  public void render() {
    System.out.println("<table class=\"grid\">");
    foreach(Tag child: children) {
      child.render();
    }
    System.out.println("</table>");
  }
  ...
}

سيتم بناء الكائنات في شجرة عن طريق تحليل XML. سيتم استدعاء طريقة Render () على عقدة الجذر. أحب هذا النهج بشكل خاص لأنه يتيح لي القيام بأشياء رائعة. على وجه الخصوص ، إذا كان لدي علامة خلية على النحو الوارد أعلاه مع نوع السمة = "السعر":

<cell type="price">$54.95</price>

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

<td>
  <span class="currency_symbol">$</span>
  <span class="decimal_number">54.95</span>
</td>

أسئلة:

هل يجب أن أفعل هذا أم يجب أن أستخدم XSLT؟ ما هي مزايا استخدام XSLT التي قد أفتقدها؟ إذا كان ينبغي علي استخدام XSLT ، فكيف يمكنني تحليل محتويات السعر؟

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

المحلول

لا أستطيع حقًا أن أقول الكثير عن سبب ذهابك مع الشخص أو الآخر.

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

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

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

<cell type="price" symbol="$">54.95</cell>

ومع ذلك ، على افتراض أنه لا يمكنك فعل أي شيء حيال ذلك ، فإن XSLT هذا سيعتني به.

<xsl:template match="cell[@type='price']">
  <td>
    <xsl:variable name="vNonNumbers" select="translate(., '0123456789.', '')" />
    <xsl:variable name="vTheNumbers" select="translate(., $vNonNumbers, '')" />
    <span class="currency_symbol">
      <xsl:value-of select="$vNonNumbers" />
    </span>
    <span class="decimal_number">
      <xsl:value-of select="$vTheNumbers" />
    </span>
  </td>
</xsl:template>

آمل أن تتمكن من معرفة سبب كون ما سبق رمزًا سيئًا بشكل أساسي. قارن بالبديل (إذا كان XML الخاص بك سيكون بيانات منفصلة وتنسيق):

<xsl:template match="cell[@type='price']">
  <td>
    <span class="currency_symbol">
      <xsl:value-of select="@symbol" />
    </span>
    <span class="decimal_number">
      <xsl:value-of select="." />
    </span>
  </td>
</xsl:template>

نصائح أخرى

الرمز الذي تقترحه لديه بعض المشكلات. والأكبر هو أنك ترميز الإخراج الصعب للذهاب إلى Standard Out ، مما يجعل من الصعب إجراء معالجة إضافية بعد. لن يكون من الصعب تغيير هذا عن طريق تعديل طريقة العرض الخاصة بك لقبول دفق الإخراج أو الكاتب.

بغض النظر عن ذلك ، فإن ما تقترحه هو طن من كود Java الذي سيتم تنفيذ تحويل XSLT محدد للغاية. أنت أفضل حالًا فقط في التعلم واستخدام XSLT لتحويل XML إلى HTML. الميزة هي أن XSLT هي أداة للأغراض العامة المصممة لهذا النوع من التحول بالضبط.

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

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
  <xsl:template match="/grid">
    <table class="grid">
      <xsl:apply-templates select="headingRow"/>
      <xsl:apply-templates select="row"/>
    </table>
  </xsl:template>
  <xsl:template match="headingRow">
      <tr>
        <xsl:apply-templates select="cell" mode="heading"/>
      </tr>
  </xsl:template>
  <xsl:template match="row">
      <tr>
        <xsl:apply-templates select="cell" mode="normal"/>
      </tr>
  </xsl:template>  
  <xsl:template match="cell" mode="heading">
    <th><xsl:value-of select="."/></th>
  </xsl:template>

  <xsl:template match="cell" mode="normal">
    <xsl:choose>
      <xsl:when test="@type='price'">
        <td>
          <span class="currency_symbol">
            <xsl:value-of select="." />
          </span>
          <span class="decimal_number">
            <xsl:value-of select="." />
          </span>
        </td>
      </xsl:when>
      <xsl:otherwise>
        <td>
          <xsl:value-of select="." />
        </td>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top