سؤال

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

لقد فعلت شيئا كهذا في الماضي باستخدام تعبيرات بيرل العادية ، لكن XSLT هي لعبة كرة جديدة تماما بالنسبة لي.

أي مؤشرات في إنشاء مثل هذا القالب سيكون موضع تقدير كبير!

شكرا كريشنا

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

المحلول

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

وهذا من شأنه أن يكون المؤشر. وسوف تحتاج إلى بعض الوقت للعمل على القالب. :-)


استغرق الأمر بعض التجارب، وخصوصا للحصول على مساحة داخل كل شيء. (I يساء استخدامها شخصية لهذا!) ولكن هذا الرمز يجب أن تعطيك فكرة ...

وأنا استخدم هذا XML:

<?xml version="1.0" encoding="UTF-8"?>
<blah>UserLicenseCode</blah>

وثم هذه الأنماط:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:output method="text"/>
    <xsl:variable name="Space">*</xsl:variable>
    <xsl:template match="blah">
    <xsl:variable name="Split">
        <xsl:call-template name="Split">
            <xsl:with-param name="Value" select="."/>
            <xsl:with-param name="First" select="true()"/>
        </xsl:call-template></xsl:variable>
        <xsl:value-of select="translate($Split, '*', ' ')" />
    </xsl:template>
    <xsl:template name="Split">
        <xsl:param name="Value"/>
        <xsl:param name="First" select="false()"/>
        <xsl:if test="$Value!=''">
            <xsl:variable name="FirstChar" select="substring($Value, 1, 1)"/>
            <xsl:variable name="Rest" select="substring-after($Value, $FirstChar)"/>
                <xsl:if test="not($First)">
                    <xsl:if test="translate($FirstChar, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', '..........................')= '.'">
                        <xsl:value-of select="$Space"/>
                    </xsl:if>
                </xsl:if>
                <xsl:value-of select="$FirstChar"/>
                <xsl:call-template name="Split">
                    <xsl:with-param name="Value" select="$Rest"/>
                </xsl:call-template>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

ووحصلت على هذا نتيجة:

User License Code

هل نضع في اعتبارنا أن المساحات وغيرها من الأحرف مساحة بيضاء لا تميل إلى تجريد بعيدا عن XML، ولهذا السبب أنا استخدم '*' بدلا من ذلك، وهو ما يترجم إلى الفضاء.

وبطبيعة الحال، يمكن تحسين هذا الرمز. هذا ما يمكنني أن نخرج في 10 دقيقة من العمل. في لغات أخرى، ان الامر سيستغرق خطوط أقل من التعليمات البرمجية ولكن في XSLT انها لا تزال سريعة جدا، بالنظر إلى كمية من خطوط كود التي يحتوي عليها.

نصائح أخرى

حل XSLT + FXSL (في XSLT 2.0، ولكن نفس الكود تقريبًا سيعمل مع XSLT 1.0 وFXSL 1.x):

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:f="http://fxsl.sf.net/"
xmlns:testmap="testmap"
exclude-result-prefixes="f testmap"
>
   <xsl:import href="../f/func-str-dvc-map.xsl"/>
   <testmap:testmap/>

   <xsl:output omit-xml-declaration="yes" indent="yes"/>

   <xsl:template match="/">
     <xsl:variable name="vTestMap" select="document('')/*/testmap:*[1]"/>

     '<xsl:value-of select="f:str-map($vTestMap, 'UserLicenseCode')"
       />'
   </xsl:template>

    <xsl:template name="mySplit" match="*[namespace-uri() = 'testmap']"
     mode="f:FXSL">
      <xsl:param name="arg1"/>

      <xsl:value-of select=
       "if(lower-case($arg1) ne $arg1)
         then concat(' ', $arg1)
         else $arg1
       "/>
    </xsl:template>
</xsl:stylesheet>

عند تطبيق التحويل أعلاه على أي مستند XML مصدر (غير مستخدم)، يتم إنتاج النتيجة الصحيحة المتوقعة:

'رمز ترخيص المستخدم'

القيام مذكرة:

  1. نحن نستخدم إصدار DVC لوظيفة/قالب FXSL str-map().هذه دالة ذات ترتيب أعلى (HOF) والتي تأخذ وسيطتين:وظيفة أخرى وسلسلة. str-map() يطبق الدالة على كل حرف من السلسلة ويعيد تسلسل النتائج.

  2. نظرًا لاستخدام الدالة ذات الأحرف الصغيرة () (في إصدار XSLT 2.0)، فإننا لسنا مقيدين بالأبجدية اللاتينية فقط.

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