如何在xslt中嵌套具有不同标记的元素

问题描述:

我在做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

这个生成的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