【问题标题】:Create XSLT for XML from XML从 XML 为 XML 创建 XSLT
【发布时间】:2014-03-06 06:50:23
【问题描述】:

我必须通过 XSL 将 XML 转换为另一个 XML。我有以下 XML

<?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。

【问题讨论】:

    标签: c# xml xslt


    【解决方案1】:

    您没有提供有关该输入如何导致该输出的解释(例如,为什么输出中没有ISVALID 字段?ISVALID 与此过程相关还是应该被忽略?为什么没有@987654323 @ 输出中的字段?),但这将产生您描述的输出:

    <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>
    

    【讨论】:

      【解决方案2】:
                  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>";
      

      【讨论】:

        猜你喜欢
        • 2014-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多