2013-10-01 103 views
1

我仍在學習XSL,並試圖將我從XSL獲得的值更改爲另一個值。 (我使用的是在線網站我的XML轉換爲另一種XML使用XSL)使用XSL將XML轉換爲另一個XML

XML

<?xml version="1.0" encoding="UTF-8"?> 
<Person> 
    <Student> 
     <Info Name="Jen" Age="20" Class="C" /> 
    </Student> 
    <Student> 
     <Info Name="Sam" Age="21" Class="B" /> 

    </Student> 

</Person> 

可以說有很多students(甚至相同的名字)

XSLT

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

    <xsl:template match="Person"> 
     <Person> 

     <lookuptable> 
      <name first="Jen" ori="Jenny" /> 
      <name first="Sam" ori="Sammy" /> 
     </lookuptable> 

     <xsl:for-each select="Student"> 
      <Info Name="{Info/@Name}" Age="{Info/@Age}" Class="{Info/@Class}" /> 
     </xsl:for-each> 

     </Person> 
    </xsl:template> 
</xsl:stylesheet> 

我創建了一個LookupTable中

輸出

<?xml version="1.0" encoding="UTF-8"?> 
<Person> 
    <lookuptable> 
     <name ori="Jenny" first="Jen" /> 
     <name ori="Sammy" first="Sam" /> 
    </lookuptable> 
    <Info Class="C" Age="20" Name="Jen" /> 
    <Info Class="B" Age="21" Name="Sam" /> 
</Person> 

我想改變我的輸出,每一個「仁」看來我希望它是「珍妮」等用我LookupTable中時間的意義。我怎麼能做到這一點?或者是否更容易創建另一個XSL來將輸出(最後一個XML)轉換爲我需要的要求?在此先感謝..

回答

1

這裏是XSLT 2.0版本@ halfbit的回答(我沒有複製LookupTable中的輸出,我認爲是不是真的想):

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

    <xsl:variable name="lookuptable" as="element(name)*"> 
     <name first="Jen" ori="Jenny" /> 
     <name first="Sam" ori="Sammy" /> 
    </xsl:variable> 

    <xsl:template match="Person"> 
     <Person> 
     <xsl:for-each select="Student"> 
      <xsl:variable name="key" select="Info/@Name"/> 
      <Info Age="{Info/@Age}" Class="{Info/@Class}"> 
      <xsl:attribute name="Name" select="$lookuptable[@first=$key]/@ori"/> 
      </Info> 
     </xsl:for-each> 
     </Person> 
    </xsl:template> 
</xsl:stylesheet> 
+0

非常感謝... – Hash

1

您可以將查找表放入一個變量並通過節點集擴展使用它。我試了一下http://www.xsltcake.com/

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" 
    xmlns:exsl="http://exslt.org/common"> 

    <xsl:variable name="lookuptable"> 
    <lookuptable> 
     <name first="Jen" ori="Jenny" /> 
     <name first="Sam" ori="Sammy" /> 
    </lookuptable> 
    </xsl:variable> 

    <xsl:template match="Person"> 
     <Person> 

     <xsl:copy-of select="$lookuptable"/> 

     <xsl:for-each select="Student"> 
      <xsl:variable name="key" select="Info/@Name"/> 
      <Info Age="{Info/@Age}" Class="{Info/@Class}"> 
      <xsl:attribute name="Name"> 
       <xsl:value-of select="exsl:node-set($lookuptable)/lookuptable/name[@first=$key]/@ori"/> 
      </xsl:attribute> 
      </Info> 
     </xsl:for-each> 

     </Person> 
    </xsl:template> 
</xsl:stylesheet> 

有關此看到帕維爾Minaev的回答細節XSL: How best to store a node in a variable and then us it in future xpath expressions? 這也解釋了使用XSLT 2.所以,你可能想改進我的方法對XSLT 2,當你將不需要exsl擴展。