سؤال

الموقف:

لدي بسيطة XML المستند الذي يحتوي على معلومات الصورة.أحتاج إلى تحويله إلى لغة البرمجة.ومع ذلك، لا يمكنني رؤية مكان العلامة المفتوحة ومتى أستخدم ملف XSL الكود أدناه، تظهر رسالة الخطأ التالية:

"لا يمكن كتابة عقدة سمة عندما لا تكون هناك علامة بدء عنصر مفتوحة."

محتوى XML:

<root>
    <HeaderText>
        <HeaderText>Dan Testing</HeaderText>
    </HeaderText>
    <Image>
        <img width="100" height="100" alt="FPO lady" src="/uploadedImages/temp_photo_small.jpg"/>
    </Image>
    <BodyText>
        <p>This is a test of the body text<br  /></p>
    </BodyText>
    <ShowLinkArrow>false</ShowLinkArrow>
</root>

كود اكس اس ال:

<xsl:stylesheet version="1.0" extension-element-prefixes="msxsl"
    exclude-result-prefixes="msxsl js dl" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:js="urn:custom-javascript" xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:dl="urn:datalist">
    <xsl:output method="xml" version="1.0" omit-xml-declaration="yes" indent="yes" encoding="utf-8"/>
    <xsl:template match="/" xml:space="preserve">
        <img>
            <xsl:attribute name="width">
                100
            </xsl:attribute>
            <xsl:attribute name="height">
                100
            </xsl:attribute>
            <xsl:attribute name="class">
                CalloutRightPhoto
            </xsl:attribute>
            <xsl:attribute name="src">
                <xsl:copy-of select="/root/Image/node()"/>
            </xsl:attribute>
        </img>
    </xsl:template>
</xsl:stylesheet>
هل كانت مفيدة؟

المحلول

فقط لتوضيح المشكلة هنا - الخطأ موجود في الجزء التالي من التعليمات البرمجية:

<xsl:attribute name="src">
    <xsl:copy-of select="/root/Image/node()"/>
</xsl:attribute>

تأخذ التعليمات xsl:copy-of عقدة أو مجموعة عقدة وتقوم بعمل نسخة منها - لإخراج عقدة أو مجموعة عقدة.ومع ذلك، لا يمكن أن تحتوي السمة على عقدة، بل على قيمة نصية فقط، لذلك قد يكون xsl:value-of حلاً ممكنًا (حيث يؤدي ذلك إلى إرجاع القيمة النصية للعقدة أو مجموعة العقد).

الحل الأقصر بكثير (وربما الأكثر أناقة) هو ما يلي:

<img width="100" height="100" src="{/root/Image/node()}" class="CalloutRightPhoto"/>

يُطلق على استخدام {} في السمة اسم قالب قيمة السمة، ويمكن أن يحتوي على أي تعبير XPATH.

لاحظ أنه يمكن استخدام نفس XPath هنا كما استخدمته في xsl_copy-of لأنه يعرف أنه يأخذ القيمة النصية عند استخدامها في قالب قيمة السمة.

نصائح أخرى

ألا ينبغي أن يكون ذلك:

<xsl:value-of select="/root/Image/img/@src"/>

؟يبدو أنك تحاول نسخ عقدة الصورة/img بأكملها إلى السمة @src

من أجل إضافة سمات، يريد XSL

<xsl:element name="img">
     (attributes)
</xsl:element>

بدلا من مجرد

<img>
     (attributes)
</img>

على الرغم من أنه نعم، إذا كنت تقوم فقط بنسخ العنصر كما هو، فلن تحتاج إلى أي من ذلك.

لا يهم - أنا أحمق.أنا فقط بحاجة <xsl:قيمة التحديد = "/root/Image/node()"/>

الخيار الآخر للمحاولة هو واضح ومباشر

<img width="100" height="100" src="/root/Image/image.jpeg" class="CalloutRightPhoto"/>

أي.بدون {} ولكن بدلاً من ذلك يعطي مسار الصورة المباشر

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