2013-02-21 58 views
3

我是XSLT的新手,我試圖實現相當簡單的重構。我有一個代表一個人的xml文檔(出於說明目的)。我有許多元素。從這些我想提取first_namelast_name(和關鍵的其他)到一個新的full_name元素。我見過這個問題here。 「renameWrapped」方法起作用。但是它不夠通用,因爲我無法保證輸入文檔中元素的排序。使用XSLT進行簡單XML重構

我有下面的XML:

<?xml version="1.0" encoding="utf-8"?> 
<myname:Person xmlns:myname="http://www.myname.co.uk/def"> 
    <myname:attr1>some value</myname:attr1> 
    <myname:first_name>john</myname:first_name> 
    <myname:last_name>smith</myname:last_name> 
    <myname:attr2>some value</myname:attr2> 
    <!-- other person stuff --> 
</myname:Person> 

這是由以下XSL轉換:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:myname="http://www.myname.co.uk/def"> 
    <xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="myname:Person"> 
     <myname:Person> 
      <xsl:copy> 
       <xsl:apply-templates select="@*|node()[local-name() != 'first_name' and local-name() != 'Person' and local-name() != 'last_name']"/> 
      </xsl:copy> 
      <myname:FullName> 
       <xsl:apply-templates select="myname:first_name | myname:last_name"/> 
      </myname:FullName> 
     </myname:Person> 
    </xsl:template> 

</xsl:stylesheet> 

然而,這是給我myname:Person下面的輸出被複制:

<?xml version="1.0" encoding="UTF-8"?> 
<myname:Person xmlns:myname="http://www.myname.co.uk/def"> 
    <myname:Person> 
     <myname:attr1>some value</myname:attr1> 
     <myname:attr2>some value</myname:attr2> 
    </myname:Person> 
    <myname:FullName> 
     <myname:first_name>john</myname:first_name> 
     <myname:last_name>smith</myname:last_name> 
    </myname:FullName> 
</myname:Person> 

我做錯了什麼?

在此先感謝您的幫助。

回答

4

其中一個<myname:Person>元素來自模板中的文字結果元素,另一個來自<xsl:copy>。如果你想

<?xml version="1.0" encoding="UTF-8"?> 
<myname:Person xmlns:myname="http://www.myname.co.uk/def"> 
    <myname:attr1>some value</myname:attr1> 
    <myname:attr2>some value</myname:attr2> 
    <myname:FullName> 
     <myname:first_name>john</myname:first_name> 
     <myname:last_name>smith</myname:last_name> 
    </myname:FullName> 
</myname:Person> 

後來乾脆離開了<xsl:copy>,即

<xsl:template match="myname:Person"> 
    <myname:Person> 
     <xsl:apply-templates select="@*|node()[local-name() != 'first_name' and local-name() != 'Person' and local-name() != 'last_name']"/> 
     <myname:FullName> 
      <xsl:apply-templates select="myname:first_name | myname:last_name"/> 
     </myname:FullName> 
    </myname:Person> 
</xsl:template> 

或可替換地離開了明確<myname:Person>

<xsl:template match="myname:Person"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()[local-name() != 'first_name' and local-name() != 'Person' and local-name() != 'last_name']"/> 
     <myname:FullName> 
      <xsl:apply-templates select="myname:first_name | myname:last_name"/> 
     </myname:FullName> 
    </xsl:copy> 
</xsl:template> 
+0

嗨,你已經發布第二個代碼片段正是我需要的。第一個也適用。非常感謝。一旦我的聲望允許,我會記得投票。 – 2013-02-21 10:36:31