Вопрос

Я использую 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top