2012-10-24 90 views
0

我想使用XSLT將一個XML文件拆分爲多個小文件。我讀到這可以使用exsl:document。我已經設法排除 - 除了一個小問題以外 - 我只能輸出一個文件。這裏是我的XML:無法使用XSLT中的exsl:文檔拆分文檔

<People> 
    <Person> 
     <FirstName>John</FirstName> 
     <LastName>Doe</LastName> 
    </Person> 
    <Person> 
     <FirstName>Jack</FirstName> 
     <LastName>White</LastName> 
    </Person> 
    <Person> 
     <FirstName>Mark</FirstName> 
     <LastName>Wall</LastName> 
    </Person> 
    <Person> 
     <FirstName>John</FirstName> 
     <LastName>Ding</LastName> 
    </Person> 
    <Person> 
     <FirstName>Cyrus</FirstName> 
     <LastName>Ding</LastName> 
    </Person> 
    <Person> 
     <FirstName>Megan</FirstName> 
     <LastName>Boing</LastName> 
    </Person> 
</People> 

這裏是我的XSLT:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:exsl="http://exslt.org/common" 
    extension-element-prefixes="exsl" 
    exclude-result-prefixes="exsl" 
    version="1.0"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/"> 
    <xsl:for-each select="People/Person"> 
     <exsl:document href="{//FirstName}_{//LastName}.xml"> 
     <People> 
      <xsl:copy-of select="."/> 
     </People> 
     </exsl:document> 
    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

執行此使用xsltproc data.xsl data.xml僅生成一個文件名爲John_Doe.xml。我找不到任何其他文件。

如何將所有Person拆分爲單獨的文件?

回答

1

變化

<xsl:template match="/"> 
    <xsl:for-each select="People/Person"> 
     <exsl:document href="{//FirstName}_{//LastName}.xml"> 
     <People> 
      <xsl:copy-of select="."/> 
     </People> 
     </exsl:document> 
    </xsl:for-each> 
    </xsl:template> 

<xsl:template match="/"> 
    <xsl:for-each select="People/Person"> 
     <exsl:document href="{FirstName}_{LastName}.xml"> 
     <People> 
      <xsl:copy-of select="."/> 
     </People> 
     </exsl:document> 
    </xsl:for-each> 
    </xsl:template> 
+0

馬丁,你將能夠解釋爲什麼''//造成如此的行爲呢? –

+1

你的代碼爲每個'Person'創建一個結果文檔,但是每次都有相同的名字,所以你最終創建了多次創建一個文件。原因是'// FirstName'選擇根節點的所有'FileName'後代,並且屬性值模板'{// FirstName}'取得第一個選定節點的字符串值。對於{{姓氏}}也是一樣。相反,您希望選擇相對於每個'Person'的'FirstName'和'LastName'作爲'for-each'主體內的上下文節點。這就是相對路徑表達式「FirstName」和「LastName」所做的。 –