3

我有一个大型 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删除了所有的注释元素,所以这些注释中包含的信息丢失了。

4

2 回答 2

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>
于 2012-04-05T21:36:04.923 回答
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 具有可承受的大小:)

于 2012-04-06T15:54:11.973 回答