2014-03-06 104 views
-3

我必须通过XSL将XML转换为另一个XML。我有以下XML从XML创建用于XML的XSLT

<?xml version="1.0" encoding="UTF-8"?><SKOS xmlns="http://www.w3.org/2004/02/skos/core#" xmlns:skos="http://www.w3.org/2004/02/skos/core#" xmlns:skosxl="http://www.w3.org/2008/05/skos-xl#"> 
    <skos:descriptor ID="7769" TAGNO="111" ISVALID="true"> 
     <skos:altLabel>ABYSSINIAN Expedition (1867-1868)</skos:altLabel> 
     <skos:prefLabel>Abyssinian Expedition (1867-1868)</skos:prefLabel> 
     <skos:broader>Ethiopia -- History -- 1490-1889</skos:broader> 
     <skos:broader>Great Britain -- History -- Victoria, 1837-1901</skos:broader> 
     <skosxl:hiddenLabel>Expedition to Abyssinia (1867-1868)</skosxl:hiddenLabel> 
     <skosxl:hiddenLabel>British Expedition to Abyssinia (1867-1868)</skosxl:hiddenLabel> 
     <skosxl:hiddenLabel>Magdala Campaign, 1867-1868</skosxl:hiddenLabel> 
     <skosxl:hiddenLabel>Napier Expedition, 1867-1868</skosxl:hiddenLabel> 
    </skos:descriptor> 
</SKOS> 

,我希望输出这样

<add> 
<doc> 
    <field name="id">7769</field> 
    <field name="TAGNO">111</field> 
    <field name="altLabel">ABYSSINIAN Expedition (1867-1868)</field> 
    <field name="broader">Ethiopia -- History -- 1490-1889</field> 
    <field name="broader">Great Britain -- History -- Victoria, 1837-1901</field> 
    <field name="hiddenLabel">Expedition to Abyssinia (1867-1868)</field> 
    <field name="hiddenLabel">British Expedition to Abyssinia (1867-1868)</field> 
    <field name="hiddenLabel">Magdala Campaign, 1867-1868</field> 
    <field name="hiddenLabel">Napier Expedition, 1867-1868</field> 

</doc> 

我没有得到如何利用它XSLT。

回答

0

你没有提供关于如何在输出输入结果(如为什么会出现在输出中没有ISVALID场?是有关这个过程ISVALID还是应该被忽略?为什么没有prefLabel场输出解释?),但是这会产生你所描述的输出:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:skos="http://www.w3.org/2004/02/skos/core#" 
       exclude-result-prefixes="skos" 
       > 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 

    <xsl:template match="/*"> 
    <add> 
     <xsl:apply-templates select="skos:descriptor" /> 
    </add> 
    </xsl:template> 

    <xsl:template match="skos:descriptor"> 
    <doc> 
     <field name="id"> 
     <xsl:value-of select="@ID"/> 
     </field> 
     <xsl:apply-templates select="@*[not(name() = 'ID' or name() = 'ISVALID')] | 
            *[not(self::skos:prefLabel)]" /> 
    </doc> 
    </xsl:template> 

    <xsl:template match="@* | *"> 
    <field name="{local-name()}"> 
     <xsl:value-of select="." /> 
    </field> 
    </xsl:template> 
</xsl:stylesheet> 

当你的样品输入运行,其结果是:

<add> 
    <doc> 
    <field name="id">7769</field> 
    <field name="TAGNO">111</field> 
    <field name="altLabel">ABYSSINIAN Expedition (1867-1868)</field> 
    <field name="broader">Ethiopia -- History -- 1490-1889</field> 
    <field name="broader">Great Britain -- History -- Victoria, 1837-1901</field> 
    <field name="hiddenLabel">Expedition to Abyssinia (1867-1868)</field> 
    <field name="hiddenLabel">British Expedition to Abyssinia (1867-1868)</field> 
    <field name="hiddenLabel">Magdala Campaign, 1867-1868</field> 
    <field name="hiddenLabel">Napier Expedition, 1867-1868</field> 
    </doc> 
</add> 
+0

它借机d。非常感谢。 – user

0
  String st = "Your Xml"; 
      XmlDocument doc = new XmlDocument(); 
      doc.LoadXml(st); 
      XmlReader read = XmlReader.Create(new StringReader(st)); 
      string Xml = "<doc>"; 
      while (read.Read()) 
      { 
       if (read.AttributeCount > 0) 
       { 
        for (int i = 0; i < read.AttributeCount; i++) 
        { 
         if (read.Name == "xml" || read.Name.Split(':').Count() < 2) 
          break; 
         var node = doc.GetElementsByTagName(read.Name); 
         Xml += "<field name=\"" + node[0].Attributes[i].Name + "\">" + node[0].Attributes[i].Value + "</field>"; 
        } 
       } 
       else 
       { 
        if (read.Name != string.Empty && read.Name.Split(':').Count() > 1) 
         Xml += "<field name=\"" + read.LocalName + "\">" + read.ReadInnerXml() + "</field>"; 
       } 
      } 
      Xml += "</doc>";