2017-04-19 22 views
0

我有幾個帶有數據的文件,我想將一些節點分組並製作一個文件。我只給出了2個示例文件,但它可能很多。輸入文件以包含(list.xml)的形式列在xml文件中。結合使用XSLT製作一個文件的不同文件中的節點

基本上,分組應該根據每個文件進行,每個文件都應該列爲該特定功能區域的節點。

這可能與XSLT有關嗎?可能有多個轉換?

文件列表:list.xml

<?xml version="1.0" encoding="UTF-8"?> 
<index xmlns:xi="http://www.w3.org/2001/XInclude"> 
    <xi:include href="xml/models/1c8dca64-8b40-4e58-8581-5104f5ca3f3e.xml"/> 
    <xi:include href="xml/models/7f10e39d-ca8c-4c17-9a0f-2dcbceaaed51.xml"/> 
    <xi:include href="xml/models/2d90b9b4-793c-4d8b-9e06-0a93dfa738a2.xml"/> 
    <xi:include href="xml/models/4ee7085e-8241-4dae-a095-38ede5fd7fb0.xml"/> 
</index> 

輸入文件01:1c8dca64-8b40-4e58-8581-5104f5ca3f3e.xml

<model> 
    <contains> 
     <vertex> 
     <functionalarea>Supply Chain</functionalarea> 
     <breakdowns> 
      <model>34c1e701-5a70-4493-b877-38624348947c</model> 
     </breakdowns> 
     </vertex> 
     <vertex> 
     <functionalarea>Supply Chain</functionalarea> 
     <breakdowns> 
      <model>25a39e71-aa59-4f63-9c09-8cc4e36bae72</model> 
     </breakdowns> 
     </vertex> 
     <vertex> 
     <functionalarea>Planning</functionalarea> 
     <breakdowns> 
      <model>45c0d6c3-a910-4050-b10e-f17eb7276c44</model> 
     </breakdowns> 
     </vertex> 
    </contains> 
</model> 

輸入文件02:7f10e39d- ca8c-4c17-9a0f-2dcbceaaed51.xml

<model> 
    <contains> 
     <vertex> 
     <functionalarea>Supply Chain</functionalarea> 
     <breakdowns> 
      <model>58a77718-1e95-408b-a6ae-f185348ec310</model> 
     </breakdowns> 
     </vertex> 
     <vertex> 
     <functionalarea>Planning</functionalarea> 
     <breakdowns> 
      <model>87767baa-bab9-46dd-80d8-a0d0c3993429</model> 
     </breakdowns> 
     </vertex> 
     <vertex> 
     <functionalarea>Execution</functionalarea> 
     <breakdowns> 
      <model>f21aef69-9772-49bd-b6c1-4f3e55fc3887</model> 
     </breakdowns> 
     </vertex> 
    </contains> 
</model> 

需要的輸出

<tree> 
    <node> 
     <name>Supply Chain</name> 
     <children> 
      <child>34c1e701-5a70-4493-b877-38624348947c</child> 
      <child>25a39e71-aa59-4f63-9c09-8cc4e36bae72</child> 
      <child>58a77718-1e95-408b-a6ae-f185348ec310</child> 
     </children> 
    </node> 
    <node> 
     <name>Planning</name> 
     <children> 
      <child>45c0d6c3-a910-4050-b10e-f17eb7276c44</child> 
      <child>87767baa-bab9-46dd-80d8-a0d0c3993429</child> 
     </children> 
    </node> 
    <node> 
     <name>Execution</name> 
     <children> 
      <child>f21aef69-9772-49bd-b6c1-4f3e55fc3887</child> 
     </children> 
    </node> 
</tree> 
+0

可能重複[如何使用xsl合併多個xml文件?](http://stackoverflow.com/questio ns/9210134/how-to-merge-multiple-xml-files-using-xsl) – Rao

+0

您已經爲[xslt-1.0]和[xslt-2.0]添加了標籤。你實際使用哪個? –

+1

您有兩個選擇,您可以使用XInclude,只需在解析器/ XSLT處理器使用的解析器中啓用XInclude處理,然後由XSLT處理的輸入將不包含'xi:include'元素,而是包含引用的內容和你可以簡單地將它分組。或者,您可以使用例如'document(index/xi:include/@ href)'拉入那些引用的文件,然後使用分組。至於分組,請參閱https://www.w3.org/TR/xslt20/#grouping-examples。 –

回答

1

首先綁定變量$模型所設定的模型元素,你可以在許多方面做的,例如

<xsl:variable name="models" select="//@href/document(.)/*"/> 

然後做分組:

<xsl:for-each-group select="$models/*/vertex" group-by="functionalarea"> 
    <node> 
     <name><xsl:value-of select="current-grouping-key()"/></name> 
     <children> 
      <xsl:for-each select="current-group()"> 
      <child><xsl:value-of select=".//model"/></child> 
      </xsl:for-each> 
     </children> 
    </node> 
</xsl:for-each-group> 
+0

感謝你的代碼幫了很多。如果我有XML輸入 ' ' 我怎樣才能得到下面的輸出?我怎樣才能獲得組循環中的父? ' 供應鏈 34c1e701-5a70-4493-b877-38624348947c 25a39e71-aa59-4f63-9c09-8cc4e36bae72 58a77718-1e95-408b-a6ae -f185348ec310 .. ' –

+0

如果這是對原始問題的澄清,請編輯該問題。如果這是一個新問題,那就開始一個新問題。請不要在評論中提出補充問題 - 它們不是爲此而設計的,並且格式最終不可讀。 –

+0

感謝您的評論,但上述代碼無法按預期工作。它所做的是將兩個文件中的所有節點合併到一個文件中,但不會根據對它們進行分組。我假設這是因爲包含文件內容每次只讀一個,然後if沒有常見的它只包含內容。 –

相關問題