0

在进行 xslt 转换时,我相当陌生。我正在尝试转换以下 xml 代码(使用 xslt 1.0):

<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 调用似乎不是正确的使用方法。任何想法如何做到这一点?如果您知道自己在做什么(与我不同),我怀疑它必须相对直截了当。

谢谢。

4

1 回答 1

0

这个在 1.0 版上生成的 XSLT 能够获得您想要的输出:

<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>
于 2013-05-08T05:19:49.077 回答