2016-10-20 182 views
0

我有以下XML文檔,我需要將其轉換爲具有額外元素的新XML文檔。XML到XML使用XSLT添加元素

<doc> 
     <colleges>   
      <college>   
       <college-name>harvard</college-name>   
        <members> 
         <!-- College staff--> 
         <staff>  
          <employee id="2200010001" contract="full-time"/>        
          <employee id="2200010002" contract="temp"/> 
         </staff> 
         <!-- College students --> 
         <students> 
          <student id="1000020001"/> 
          <student id="1000020003"/> 
         </students> 
        </members> 
      </college> 
      <college>   
       <college-name>wharton</college-name>   
        <members> 
         <!-- College staff--> 
         <staff>  
          <employee id="2200010003" contract="full-time"/>        
          <employee id="2200010004" contract="temp"/> 
         </staff> 
         <!-- College students --> 
         <students>        
          <student id="1000020002"/> 
         </students> 
        </members> 
       </college> 
     </colleges> 
     <students>     
      <student id="1000020001">   
       <personal>    
        <name> 
         <firstname>Hillary</firstname> 
         <lastname>Clinton</lastname> 
        </name>      
        <!-- Student contact information --> 
        <contact-information> 
         <phone>+12123004000</phone> 
         <email>[email protected]</email> 
        </contact-information> 
       </personal> 
       <registration> 
        <!-- Student university information -->          
        <degree> 
         <type>undergrad</type> 
         <status>1</status> 
         <matriculated>yes</matriculated>      
        </degree> 
        <degree> 
         <type>masters</type> 
         <status>1</status> 
         <matriculated>yes</matriculated>      
        </degree> 
       </registration> 
      </student"> 
      <student id="1000020002"> 
       <personal>    
        <name> 
         <firstname>Donald</firstname> 
         <lastname>Trump</lastname> 
        </name> 
        <!-- Student contact information --> 
        <contact-information> 
         <phone>+12123004001</phone> 
         <email>[email protected]</email> 
        </contact-information> 
       </personal> 
       <registration> 
        <!-- Student university information -->          
        <degree> 
         <type>undergrad</type> 
         <status>1</status> 
         <matriculated>yes</matriculated>      
        </degree> 
        <degree> 
         <type>masters</type> 
         <status>1</status> 
         <matriculated>yes</matriculated>      
        </degree> 
       </registration> 
      </student"> 
     </students> 
    </doc> 

學生元素我需要提取的大學名稱和將它插入元素,讓學生部分顯示如下:(其餘部分是不變的,我只是說了簡單性和可讀性助學款)

<student id="1000020001">   
     <personal>    
      <name> 
       <firstname>Hillary</firstname> 
       <lastname>Clinton</lastname> 
      </name>      
      <!-- Student contact information --> 
      <contact-information> 
       <phone>+12123004000</phone> 
       <email>[email protected]</email> 
      </contact-information> 
     </personal> 
      <registration> 
       <!-- Student university information --> 
       <college-name>harvard</college-name>    
       <degree> 
        <type>undergrad</type> 
        <status>1</status> 
        <matriculated>yes</matriculated>      
       </degree> 
       <degree> 
        <type>masters</type> 
        <status>1</status> 
        <matriculated>yes</matriculated>      
       </degree> 
      </registration> 
    </student"> 

我正在使用XSLT,使用Identity rule,但我的大學名稱是空的。 有什麼建議嗎?

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="1.0"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    <!-- Student registration--> 
    <xsl:template match="student/registration"> 
     <registration> 
      <xsl:apply-templates select="@* | *"/> 
      <xsl:element name="college-name"> 
       <xsl:call-template name="extractCollegeName"> 
         <xsl:with-param name="student-id" select="student/@id"/> 
       </xsl:call-template> 
      </xsl:element> 
     </registration> 
    </xsl:template> 

    <!-- check student id for each college --> 
    <xsl:template name="extractCollegeName"> 
     <xsl:param name="student-id"/> 
     <xsl:for-each select="/doc/colleges/college"> 
      <xsl:if test="$student-id = members/students/student/@id"> 
       <xsl:value-of select="college-name"/> 
      </xsl:if> 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 
+1

:http://stackoverflow.com/questions/40104423/xslt-檢查多個節點中的值 –

回答

1

您可以使用學生證等

<xsl:key name="coll-name" match="college//student" use="@id"/> 

的關鍵從你的模板student/registration,通過匹配與父節點student的屬性關鍵拿到大學名稱,如

key('coll-name', ancestor::student/@id) 

然後通過使用xpath得到college-name的值ancestor::college/college-name

整體樣式:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="1.0"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:key name="coll-name" match="college//student" use="@id"/> 

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    <!-- Student registration--> 
    <xsl:template match="student/registration"> 
     <registration> 
      <xsl:element name="college-name"> 
       <xsl:value-of select="key('coll-name', ancestor::student/@id)/ancestor::college/college-name"/> 
      </xsl:element> 
      <xsl:apply-templates select="@* | *"/> 
     </registration> 
    </xsl:template> 

</xsl:stylesheet> 

看到它你爲什麼不使用**鍵如下所示**工作here

+0

這很好。謝謝 – spicyramen