سؤال

أستخدم xslt 2.0 لتحويل بيانات xml إلى ملفات xml.لقد قمت بإنشاء ملف xsl للعثور على جميع أسماء الملفات في مجلد، وكان الأمر جيدًا:

أسماء الملفات.xml

<?xml version="1.0" encoding="UTF-8"?>
<filelist>
   <file>birds2014.xml</file>
   <file>birds2013.xml</file>
</filelist>

ثم قمت بإنشاء ملف xsl للبحث داخل ملفات xml لتحديد جميع أسماء الطيور الموجودة في العلامة <spbird> في جميع الوثائق.

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

<xsl:template match="*">
        <xsl:apply-templates/> 
        <xsl:variable name="files" select="document('filelist.xml')/filelist/file"/>
            <xsl:element name="birdname">
                <xsl:for-each select="document($files)">    
                    <xsl:value-of select="//spbird">
                    </xsl:value-of>
                </xsl:for-each>
            </xsl:element>  
    </xsl:template>

نتيجة:

<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>

مُتوقع:

<birdname>Papagei</birdname>
<birdname>Wellensittich</birdname>
<birdname>Pfau</birdname>

هل أستطيع مساعدتك؟

يحررلقد غيرت

 <xsl:template match="*">

ل

   <xsl:template match="/">

مما يحل مشكلة ظهور نفس النتيجة 9 مرات (من أين جاء هذا الرقم).

والآن بمساعدتكم النتيجة هي:

<birdname>Papagei Wellensittich</birdname>
<birdname>Pfau</birdname>

Pfau هو الطائر في ملف XML الثاني.المشكلة الوحيدة هي أن المستند () يبدو أنه يقوم بعمل لكل منهما بمفرده.لذلك لا أدرج جميع الطيور بشكل منفصل في علامة اسم الطائر.

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

<xsl:template match="*">
        <xsl:apply-templates/> 
        <xsl:variable name="files" select="document('filelist.xml')/filelist/file"/>

                <xsl:for-each select="document($files)">   
                       <birdname> 
                         <xsl:value-of select="//spbird">
                       </birdname>
                    </xsl:value-of>
                </xsl:for-each>
            </xsl:element>  
    </xsl:template>
هل كانت مفيدة؟

المحلول

حاول وضع العنصر الخاص بك داخل xsl:for-each...

<xsl:for-each select="document($files)">    
    <birdname>
        <xsl:value-of select="//spbird"/>            
    </birdname>
</xsl:for-each>

ملحوظة:ما لم تكن تحاول إنشاء اسم العنصر ديناميكيًا، فلا يوجد سبب لاستخدامه xsl:element.

يحرر

في XSLT 2.0، xsl:value-of سوف أعطيك كل قيمة spbird.بدل من xsl:for-each في المستند، يجب عليك القيام بما يلي لكل منها spbird.حاول تغيير الخاص بك xsl:for-each إلى المثال أدناه.إذا لم ينجح ذلك، يرجى إضافة مثال لملفات الطيور إلى سؤالك.

<xsl:for-each select="document($files)//spbird">    
    <birdname>
        <xsl:value-of select="."/>            
    </birdname>
</xsl:for-each>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top