我有一个很大的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
会删除所有注释元素,因此这些注释中包含的信息将丢失。
答案 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具有可承受的大小:)