اختر من ضمن قائمة ملفات XML
سؤال
أستخدم 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>