Выберите из списка файлов 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-файле.Единственная проблема в том, что document(), похоже, выполняет for-each самостоятельно.Поэтому я не получаю всех птиц, перечисленных отдельно в теге названия птицы.
<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
в документе вы должны выполнить for-each на spbird
.Попробуйте изменить свой xsl:for-each
к примеру ниже.Если это не сработает, добавьте к своему вопросу пример файлов с птицами.
<xsl:for-each select="document($files)//spbird">
<birdname>
<xsl:value-of select="."/>
</birdname>
</xsl:for-each>