2013-05-07 75 views
0

我在做xslt變換時頗爲新穎。我試圖將下面的XML代碼(使用XSLT 1.0)轉換:如何在xslt中嵌套具有不同標記的元素

<generic_etd> 
    <dc.contributor>NSERC</dc.contributor> 
    <dc.creator>gradstudent</dc.creator> 
    <dc.date>2013-05-07</dc.date> 
    <dc.format>30 pages</dc.format> 
    <dc.format>545709 bytes</dc.format> 
    <thesis.degree.name>Theses (M.Eng.)</thesis.degree.name> 
    <thesis.degree.level>masters</thesis.degree.level> 
    <thesis.degree.discipline>Dept. of Mechanical Engineering<thesis.degree.discipline> 
    <thesis.degree.grantor>Concordia University</thesis.degree.grantor> 
</generic_etd> 

成以下格式:

<etd_ms:thesis> 
    <etd_ms:contributor>NSERC</etd_ms:contributor> 
    <etd_ms:creator>gradstudent</etd_ms:creator> 
    <etd_ms:date>2013-05-07</etd_ms:date> 
    <etd_ms:format>30 pages</etd_ms:format> 
    <etd_ms:format>545709 bytes</etd_ms:format> 
    <etd_ms:degree> 
     <etd_ms:name>Theses (M.Eng.)</etd_ms:name> 
     <etd_ms:level>masters</etd_ms:level> 
     <etd_ms:discipline>Dept. of Mechanical Engineering</etd_ms:discipline> 
     <etd_ms:grantor>Concordia University</etd_ms:grantor> 
    </etd_ms:degree> 
</etd_ms:thesis> 

我遇到的問題是雙重的。我可以創建除xml的度數部分之外的所有內容。但是,當我嘗試添加適當的嵌套程度部分它不適合我。我已經查看了一些線索,但xsl:key調用似乎不是正確的使用方法。任何想法如何做到這一點?如果你知道你在做什麼(我不像我),我懷疑它一定是相對直截了當的。

謝謝。

+0

顯示您的XSL樣式表,請 – 2013-05-07 22:42:33

回答

0

這個生成的XSLT的1.0版本能夠得到您想要的輸出:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
    xmlns:etd_ms="dsfdsfsdf"> 
    <xsl:output method="xml" indent="yes" encoding="UTF-8"/> 
    <xsl:strip-space elements="*"/> 

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

    </xsl:template> 

    <xsl:template match="*"> 
    <xsl:choose> 
     <xsl:when test="name()='generic_etd'"> 
     <etd_ms:thesis> 
      <xsl:apply-templates/> 
     </etd_ms:thesis> 
     </xsl:when> 
     <xsl:when test="contains(name(),'thesis.degree.')"/> 
     <xsl:otherwise> 
     <xsl:element name="{concat('etd_ms:',substring-after(name(),'.'))}"> 
      <xsl:apply-templates/> 
     </xsl:element> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

    <xsl:template name="new" match="*[contains(name(),'thesis.degree.')][1]"> 
    <etd_ms:degree> 
     <xsl:for-each select="//*[contains(name(),'thesis.degree.')]"> 
     <xsl:element name="{concat('etd_ms:',substring-after(name(),'thesis.degree.'))}"> 
      <xsl:apply-templates/> 
     </xsl:element> 
     </xsl:for-each> 
    </etd_ms:degree> 
    </xsl:template> 
</xsl:stylesheet> 
+0

感謝你,非常完美!我正在通過代碼來確保我正確理解它並瞭解我應該做什麼。 – user5013 2013-05-08 16:03:15

相關問題