如何将这些嵌入元素转换为父元素的属性?

时间:2012-04-05 21:25:55

标签: c# xslt serialization xsd

我有一个很大的XSD,其元素看起来像这样:

<xs:element name="ProgramName" type="xs:string" minOccurs="0">
  <xs:annotation>
    <xs:documentation>PN</xs:documentation> 
  </xs:annotation>
</xs:element>
<xs:element name="TestItem" type="xs:string" minOccurs="0">
  <xs:annotation>
    <xs:documentation>TA</xs:documentation> 
  </xs:annotation>
</xs:element>

我想将<documentation>元素折叠成祖父元素的属性,如下所示:

<xs:element name="ProgramName" type="xs:string" minOccurs="0" code="PN">
</xs:element>
<xs:element name="TestItem" type="xs:string" minOccurs="0" code="TA">
</xs:element>

如何使用XSLT完成此操作?或者,是否有比XSLT更好(读取:更简单)的方法?

生成的XSD将与XSD.EXE一起使用来创建C#类,用于序列化和反序列化。原始XSD不能以这种方式使用,因为XSD.EXE会删除所有注释元素,因此这些注释中包含的信息将丢失。

2 个答案:

答案 0 :(得分:2)

我就是这样做的:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*[xs:annotation]">
    <xsl:copy>
      <xsl:attribute name="code"><xsl:value-of select="xs:annotation/xs:documentation"/></xsl:attribute>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>    
  </xsl:template>

  <xsl:template match="xs:annotation"/>      

</xsl:stylesheet>

答案 1 :(得分:0)

这只是另一个答案:)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

  <xsl:template match="node()[local-name()='element']">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()[local-name()!='annotation']"/>
      <xsl:for-each select="node()[local-name()='annotation']/node()[local-name()='documentation']">
        <xsl:attribute name="code">
          <xsl:value-of select="."/>
        </xsl:attribute>
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

确实很好地考虑使用XSLT重新排列节点而不是手动操作:)我总是使用XSLT .. 我们甚至可以使用它从XSD生成样本XML ..如果XSD具有可承受的大小:)