2014-02-12 148 views
0

我想创建一个xsl文件,将现有的xml文件转换为另一种格式。虽然我能够转换大部分文件,但我遇到的问题是处理文件的前半部分。如何使一个标签成为另一个嵌套标签的属性

<generic_etd> 
    <associated_tags> 
     <master> 
     <dc.contributor>contributor</dc.contributor> 
     </master> 
     <related> 
     <dc.contributor.role>contributor role</dc.contributor.role> 
     </related> 
    </associated_tags> 
    <associated_tags> 
     <master> 
     <dc.contributor>sponsor</dc.contributor> 
     </master> 
     <related> 
     <dc.contributor.role>sponsor role</dc.contributor.role> 
     </related> 
    </associated_tags> 
    <dc.creator>gradstudent2</dc.creator> 
    <dc.date>2014-02-11</dc.date> 
    <dc.description>description</dc.description> 
    <thesis.degree.discipline>Business Administration</thesis.degree.discipline> 
</generic_etd> 

我试图做到的是采取的信息对每个associated_tag产生以下:

<etd_ms:contributor role="contributor role">contributor</etd_ms:contributor_role> 
<etd_ms:contributor role="sponsor role">sponsor</etd_ms:contributor_role> 

因此我们的目标,我的工作对XML文件通过这个简单的例子代表这里是使相关标签中的内容成为主标签中的内容的属性。由于我是xsl的新手,我甚至不知道如何开始解决这个问题。这甚至有可能吗?

编辑:我还应该指出,主标签和相关标签内的标签可以不同。在这个特定的例子中,它们是相同的,但并不一定总是如此。

谢谢。

+0

如何转换大部分文件但无法转换左侧部分?有什么问题? –

+0

在“<关联标记>”父项中是否总会有这两个关联标记(主标记和相关标记)? –

+0

我的问题是,我习惯于一次处理一行文件,而不必倒下一棵树来获取信息,然后再倒另一棵树到我需要的其他信息。就像我说的我在xsl处理新手,所以我只是不确定如何继续。 – user5013

回答

0

那好吧,这应该是相当简单,除了一两件事情:

  1. 首先,您的示例输出缺少根元素。

  2. 其次,您在输出 元素上显示etd_ms:命名空间前缀;此前缀必须声明并绑定到样式表某处的名称空间。

  3. 最后,你的输出元素已经不匹配的开始和结束标记:<etd_ms:contributor</etd_ms:contributor_role>

除此之外,请尝试以下样式:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:etd_ms="http://www.yournamespacehere.com"> 

<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 

<xsl:template match="/"> 
<output> 
    <xsl:for-each select="generic_etd/associated_tags"> 
     <etd_ms:contributor> 
      <xsl:attribute name="role"><xsl:value-of select="related/dc.contributor.role"/></xsl:attribute> 
      <xsl:value-of select="master/dc.contributor"/> 
     </etd_ms:contributor>  
    </xsl:for-each> 
</output> 
</xsl:template> 

</xsl:stylesheet> 

应用到你的输入(更正修复关闭元素),这产生:

<?xml version="1.0" encoding="utf-8"?> 
<output xmlns:etd_ms="http://www.yournamespacehere.com"> 
    <etd_ms:contributor role="contributor role">contributor</etd_ms:contributor> 
    <etd_ms:contributor role="sponsor role">sponsor</etd_ms:contributor> 
</output> 
+0

这是一个非常普遍的解决方案,但如果主标签和相关标签之间的标签可以是任何标签/值,该怎么办? – user5013

+0

然后将名称的明确引用更改为'*'。 –

相关问题