2015-04-22 73 views
1

我正在使用xslt編輯多個文件。我有輸入文件,它是我的設置文件,它看起來像這樣:帶設置的XSLT輸入文件 - 更改多個輸出文件

<root> 
    <file> 
    <folderin>/var/in/</folderin> 
    <in>10</in> 
    <folderout>/var/out</folderout> 
    <out>20</out> 
    <name>First file</name> 
    </file> 
</root> 

示例文件:

<root> 
    <element1 id1="10"> 
    ... 
    </element1> 
    <element2 id2="10" attribute="xyz"> 
    ... 
    </element2> 
</root> 

我的XSLT文件:

<?xml version="1.0" encoding="UTF-8"?> 
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" indent="yes" encoding="utf-8"/> 
     <xsl:template name="CopyXml" match="/*"> 
     <xsl:for-each select="file"> 
      <xsl:variable name="inputfile" select="concat(folderin, in, '.xml')"/> 
      <xsl:variable name="outputfile" select="concat(folderout, out, '.xml')"/> 

      <xsl:result-document method="xml" href="{$outputfile}"> 
        <xsl:copy-of select="document($inputfile)/*"/> 
      </xsl:result-document> 
      </xsl:for-each> 
     </xsl:template> 

    </xsl:stylesheet> 

在/ var /中/有幾百個文件,我只想編輯幾個文件(在本例中爲/var/in/10.xml,帶有退出文件/var/out/20.xml)。在新的文件中,我想將id1和id2屬性值更改爲我的「out」參數

我已經設法使用我的xslt複製這些具有足夠名稱的特定文件,但是我遇到了應用任何模板的問題,所以我可以更改這些文件。我試過使用應用程序模板,但是我不能使它將這些模板應用到$ outputFile,它要麼沒有做任何事情,要麼從設置文件複製$ outputFile; /有沒有人有任何想法如何做到這一點?


編輯: 輸出這個例子文件:

<root> 
    <element1 id1="20"> 
    ... 
    </element1> 
    <element2 id2="20" attribute="xyz"> 
    ... 
    </element2> 
</root> 
+0

請編輯您的問題,並顯示您想爲您顯示的「示例文件」創建的結果。我也沒有在你的代碼中看到一個「out」參數,所以我不明白這個值應該從哪裏來。 –

+0

我已經添加了我想要的結果。現在「out」參數在:select =「concat(folderout,out,'.xml')」。我嘗試添加應用模板,其中出現了param,但它總是隻應用於我的設置文件,而不是$ inputfile – Pumar

+0

因此,任何具有'in'元素中的值的屬性都需要獲得一個新值'out'元素?屬性名稱是否有限制? –

回答

0

在你的樣式有一刻:

 <xsl:result-document method="xml" href="{$outputfile}"> 
       <xsl:copy-of select="document($inputfile)/*"/> 
     </xsl:result-document> 

所以,要創建一個輸出文件,該文件將包含複製輸入文件的

爲了應用了一些修改,你必須應用模板輸入文件,所以你需要有:

 <xsl:result-document method="xml" href="{$outputfile}"> 
       <!-- further process the input file --> 
       <xsl:apply-templates select="document($inputfile)/*"/> 
     </xsl:result-document> 

,當然你的樣式表必須包含模板來處理輸入文件內容,複製和修改相關部分。

你可以嘗試一種漸進的方式,您的問題:

  • 首先,定義樣式表的規則進行改造單個輸入文件到一個輸出文件
  • 一旦這些模板做你需要,將它們複製到適用於設置樣式表文件

這個樣式表應該做的你需要什麼:

XSLT 2。0:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" indent="yes" encoding="utf-8"/> 

    <!-- template to process the settings file --> 
    <xsl:template match="/"> 
     <xsl:for-each select="root/file"> 
      <xsl:variable name="inputfile" select="concat(folderin, in, '.xml')"/> 
      <xsl:variable name="outputfile" select="concat(folderout, out, '.xml')"/> 

      <xsl:result-document method="xml" href="{$outputfile}"> 
       <xsl:apply-templates select="document($inputfile)/*" mode="processFiles"> 
        <xsl:with-param name="outputValue" select="out" tunnel="yes"/> 
       </xsl:apply-templates> 
      </xsl:result-document> 
     </xsl:for-each> 
    </xsl:template> 

    <!-- template to process the input files --> 
    <!-- identity transformation --> 
    <xsl:template match="* | @* | text()" mode="processFiles"> 
     <xsl:copy> 
      <xsl:apply-templates select="* | @* | text()" mode="#current"/> 
     </xsl:copy> 
    </xsl:template> 
    <!-- update parameters --> 
    <xsl:template match="@id1 | @id2" mode="processFiles"> 
     <xsl:param name="outputValue" tunnel="yes"/> 
     <xsl:attribute name="{name()}"> 
      <xsl:value-of select="$outputValue"/> 
     </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

值得注意的要點:

  • ,你不能只是複製輸入文件,你必須模板應用到它爲了改變它的某些部分
  • 同時應用模板到外部文件,傳遞一個名爲outputValue的參數;使用tunnel parameter讓我們每次打電話都明確地傳遞它的麻煩xsl:apply-templates
  • 我用mode="processFile"的模板來處理外部文件的內容;在這個簡單的情況並非絕對必要,但更大的樣式表的工作,雖然這是一個小「絕招」,可以幫助模板之間避免優先權衝突的設置文件另一類爲外部文件
    • 身份模板只是複製元素,屬性和文本節點
    • 的屬性id1id2特定模板使用隧道參數替換爲所期望的一個
現有值10
+0

「<! - 進一步處理輸入文件 - >」是什麼意思?在我的情況下,我想要的幾乎是相同的文件,除了那些屬性的變化,並且據我所知,可能應該是「apply-templates」。我認爲你是對的,我沒有嘗試漸進式方法,也許在我的變換模板中存在一些基本缺陷。我會盡力在明天早上做的下一件事情:) – Pumar

+0

對不起,我只是一個評論,突出我所做的改變,以及爲什麼。 – lfurini

+0

好的,所以我仍然有問題。一切正常,當我開始指向文件我想改變 - 我使用。但是我不知道如何將模板應用於「document($ inputfile)」 - 即使用。你知道該怎麼辦? – Pumar