如何在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调用似乎不是正确的使用方法。任何想法如何做到这一点?如果你知道你在做什么(我不像我),我怀疑它一定是相对直截了当的。
谢谢。
答
这个生成的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
显示您的XSL样式表,请 – 2013-05-07 22:42:33