2015-11-04 72 views
0

我想用XSL表格複製XML文件。通過複製我想「匿名化」我的XML文件,將XML的一些元素作爲變量。XSLT複製副本

基地:

<?xml version="1.0" encoding="ISO-8859-15"?> 
<root> 
    <top> 
     <nbpeople>2</nbpeople> 
    </top> 
    <people> 
     <id>45</id> 
     <name>MARTIN</name> 
     <firstname>Jean</firstname> 
     <xyx> 
      <oo>BLABLA</oo> 
      <cp>11222</cp> 
     </xyx> 
    </people> 
    <people> 
     <id>98</id> 
     <name>DUPONT</name> 
     <firstname>Yves</firstname> 
     <xyx> 
      <oo>POPOPO</oo> 
      <cp>33450</cp> 
     </xyx> 
    </people> 
</root> 

結果:

<?xml version="1.0" encoding="ISO-8859-15"?> 
<root> 
    <top> 
     <nbpeople>2</nbpeople> 
    </top> 
    <people> 
     <id>45</id> 
     <name>people 45</name> 
     <!-- {xyx/cp + id} = 11222 + 45 = 11267 --> 
     <firstname>Jean 11267</firstname> 
     <xyx> 
      <oo>BLABLA</oo> 
      <!-- {id + 20000} = 45 + 20000 = 20045 --> 
      <cp>20045</cp> 
     </xyx> 
    </people> 
    <people> 
     <id>98</id> 
     <name>people 98</name> 
     <!-- {xyx/cp + id} = 33450 + 98 = 11267 --> 
     <firstname>Yves 33548</firstname> 
     <xyx> 
      <oo>POPOPO</oo> 
      <!-- {id + 20000} = 98 + 20000 = 20098 --> 
      <cp>20098</cp> 
     </xyx> 
    </people> 
</root> 

我真正的XML文件,顯然是比較複雜的。

編輯: 我不希望像一個XSL:

<xsl:template match="people/name"> 
    <xsl:variable name="id" select="../id" /> 
    <xsl:copy> 
     <xsl:value-of select="concat('people ', $id)" /> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="people/firstname"> 
    <xsl:variable name="id" select="../id" /> 
    <xsl:copy> 
     <xsl:value-of select="concat(text(), $id)" /> 
    </xsl:copy> 
</xsl:template> 

OR 

<xsl:template match="people/name"> 
    <xsl:copy> 
     <xsl:value-of select="concat('people ', ../id)" /> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="people/firstname"> 
    <xsl:copy> 
     <xsl:value-of select="concat(text(), ../id)" /> 
    </xsl:copy> 
</xsl:template> 

我有很多處理的做,在幾個層次上覆雜的文件。這將是難以管理的。

感謝的

+0

「*以XML的一些元素作爲變量*」這並不意味着什麼。在XSL轉換過程中可以使用變量。當轉換結束時,變量不再存在。 –

+1

您能否解釋一下爲什麼不希望顯示一個XSLT?謝謝。 –

+0

我有很多處理要做,並在幾個級別上有一個複雜的文件。這將是難以管理的。 – ras88

回答

0

一旦你學會了XSLT,你會看到,是不是真正複雜。剛開始時的第一件事是跨越一切XSLT Identity Transform

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

就其本身而言,它拷貝原樣,這是你的情況下,就意味着你幾乎沒有!您只需爲您的「例外」情況設置一個模板,即name元素即可創建新值。它看起來像這樣

<xsl:template match="people/name"> 
    <xsl:copy> 
     <xsl:value-of select="concat('people ', ../id)" /> 
    </xsl:copy> 
</xsl:template> 

就是這樣!試試這個XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="people/name"> 
     <xsl:copy> 
      <xsl:value-of select="concat('people ', ../id)" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

如果您想以類似的方式更改任何其他字段,您可以添加其他模板。

編輯:如果你想讓它更有點通用的,而不是對每個單獨的字段模板,你可以做這樣的事情:

<xsl:template match="people/*[not(self::id)]"> 
     <xsl:copy> 
      <xsl:value-of select="concat(local-name(), ' ', ../id)" /> 
     </xsl:copy> 
    </xsl:template> 

這anonymises各領域下的people記錄,除了從編號

+0

我已編輯我的帖子 – ras88

+0

謝謝。但是我的文件比較複雜。我不使用每個文件的簡單ID。 – ras88

+0

我編輯了我的例子。我的真實文件有很多級別 – ras88