2014-04-11 45 views
1

我使用xslt 2.0將xml數據轉換爲xml文件。 我創建XSL來查找文件夾中的所有文件名,它工作得很好:從xml文件中選擇

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文件的鳥。 唯一的問題是,該文檔()似乎爲它自己做了一個for-each。所以,我沒有得到一個birdname標籤seperately列出的所有的鳥..

<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

嘗試把你的元素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上執行for-each。嘗試將您的xsl:for-each更改爲以下示例。如果這不起作用,請在您的問題中添加一個鳥文件示例。

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

thx,改變了它,看到我的編輯...仍然不是我預期的結果。 – user3500768

+0

@ user3500768 - 查看我的更新。如果這不起作用,請使用bird xml(包含'spbird')的示例更新您的問題。 –

+0

是的,這很合乎邏輯,非常感謝。像charme一樣工作。 – user3500768