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
拆分爲單獨的文件?
馬丁,你將能夠解釋爲什麼''//造成如此的行爲呢? –
你的代碼爲每個'Person'創建一個結果文檔,但是每次都有相同的名字,所以你最終創建了多次創建一個文件。原因是'// FirstName'選擇根節點的所有'FileName'後代,並且屬性值模板'{// FirstName}'取得第一個選定節點的字符串值。對於{{姓氏}}也是一樣。相反,您希望選擇相對於每個'Person'的'FirstName'和'LastName'作爲'for-each'主體內的上下文節點。這就是相對路徑表達式「FirstName」和「LastName」所做的。 –