ما هي أفضل طريقة لتنسيق الوقت على مدار 24 ساعة في XSLT 1.0؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

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

بالنظر إلى ملف XML التالي:

<root>
    <srcTime>2300</srcTime>
</root>

سيكون من الرائع إنتاج ملف XML الناتج:

<root>
    <dstTime>23:00</dstTime>
</root>

ومع ذلك، إذا كان ملف XML المصدر يحتوي على تنسيق وقت غير صالح على مدار 24 ساعة، فسيظهر ملف XML الناتج com.dstTime يجب أن يكون العنصر فارغًا.

على سبيل المثال، عندما يكون مصدر XML غير صالح هو كما يلي:

<root>
    <srcTime>NOON</srcTime>
</root>

يجب أن يكون ملف XML الناتج:

<root>
    <dstTime></dstTime>
</root>

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

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

المحلول

لا توجد أي تعبيرات عادية في XSLT 1.0، لذا أخشى أن مطابقة الأنماط لن تكون ممكنة.

لست واضحا إذا <srcTime>23:00</srcTime> من المفترض أن تكون قانونية أم لا؟إذا كان الأمر كذلك، حاول:

<dstTime>
  <xsl:if test="string-length(srcTime) = 4 or
                string-length(srcTime) = 5">
    <xsl:variable name="hour" select="substring(srcTime, 1, 2)" />
    <xsl:if test="$hour >= 0 and 24 > $hour">
      <xsl:variable name="minute">
        <xsl:choose>
          <xsl:when test="string-length(srcTime) = 5 and
                          substring(srcTime, 3, 1) = ':'">
            <xsl:value-of select="substring(srcTime, 4, 2)" />
          </xsl:when>
          <xsl:when test="string-length(srcTime) = 4">
            <xsl:value-of select="substring(srcTime, 3, 2)" />
          </xsl:when>
        </xsl:choose>
      </xsl:variable>
      <xsl:if test="$minute >= 0 and 60 > $minute">
        <xsl:value-of select="concat($hour, ':', $minute)" />
      </xsl:if>
    </xsl:if>
  </xsl:if>
</dstTime>

إذا لم يكن الأمر كذلك، وكانت الأرقام الأربعة هي الشيء الوحيد القانوني:

<dstTime>
  <xsl:if test="string-length(srcTime) = 4">
    <xsl:variable name="hour" select="substring(srcTime, 1, 2)" />
    <xsl:if test="$hour >= 0 and 24 > $hour">
      <xsl:variable name="minute" select="substring(srcTime, 3, 2)" />
      <xsl:if test="$minute >= 0 and 60 > $minute">
        <xsl:value-of select="concat($hour, ':', $minute)" />
      </xsl:if>
    </xsl:if>
  </xsl:if>
</dstTime>

نصائح أخرى

لا يحتوي XSLT 1.0 على أي دعم قياسي لمعالجة التاريخ/الوقت.

يجب عليك كتابة وظيفة تحليل وتنسيق بسيطة.لن يكون ذلك بسيطًا، ولن يكون جميلًا.

تم تصميم XSLT بالفعل لتحويلات الشجرة.من الأفضل إجراء هذا النوع من معالجة عقدة النص خارج XSLT.

اعتمادًا على معالج xslt الفعلي المستخدم، قد تكون قادرًا على القيام بالعمليات المطلوبة في وظيفة الامتداد المخصصة (والتي يتعين عليك إجراؤها بنفسك).

زالان يحظى بدعم جيد ل وظائف التمديد, ، يمكنك كتابتها ليس فقط بلغة Java ولكن أيضًا بلغة JavaScript أو اللغات الأخرى التي يدعمها أباتشي بي إس إف.

يدعم محرك XSLT من Microsoft الامتدادات المخصصة أيضًا، كما هو موضح في دليل مطور .NET Framework، توسيع أوراق أنماط XSLT

القي نظرة على:http://www.exslt.org/ على وجه التحديد قسم "التواريخ والأوقات".لم أتعمق في الأمر ولكن يبدو أنه قد يكون ما تبحث عنه.

حتى الدالة exslt.org time() لن تساعدك هنا، لأنها تتوقع أن يكون إدخالها بالتنسيق الصحيح (xs:dateTime أو xs:time).

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

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

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

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

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