从xml的fileliste中选择

时间:2014-04-11 15:46:14

标签: xml xslt filelist

我使用xslt 2.0将xml数据转换为xml文件。 我创建了xsl来查找文件夹中的所有文件名,工作正常:

filenames.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()似乎只为它自己做了一个。因此,我没有将所有的鸟类单独列入鸟类标签..

    <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>

1 个答案:

答案 0 :(得分:1)

尝试将您的元素放在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>