下面是一個XSLT 1.0溶液:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kxsElemByName" match="xs:element" use="@name"/>
<xsl:variable name="vSchema" select=
"document('file:///c:/temp/delete/schema.xsd')"/>
<xsl:variable name="vDoc" select="/"/>
<xsl:template match="/*">
<xsl:variable name="vElem" select="."/>
<xsl:for-each select="$vSchema">
<xsl:apply-templates select=
"key('kxsElemByName', name($vElem))">
<xsl:with-param name="pElement" select="$vElem"/>
</xsl:apply-templates>
</xsl:for-each>
</xsl:template>
<xsl:template match="xs:element">
<xsl:param name="pElement"/>
<xsl:element name="{name($pElement)}">
<xsl:apply-templates mode="generate"
select="xs:complexType/xs:sequence/*">
<xsl:with-param name="pParent" select="$pElement"/>
</xsl:apply-templates>
</xsl:element>
</xsl:template>
<xsl:template match="xs:element" mode="generate">
<xsl:param name="pParent"/>
<xsl:variable name="vProp" select=
"$pParent/property[@name = current()/@name]"/>
<xsl:element name="{$vProp/@name}">
<xsl:value-of select="$vProp/@value"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
當這個變換所提供的XML文檔(Person
重命名爲person
匹配的模式)應用於:
<person>
<property name="address" value="5" />
<property name="firstname" value="1234567890" />
<property name="lastname" value="The BFG" />
</person>
,如果提供的XML模式位於文件c:\temp\delete\schema.xsd
:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
那麼想要的,正確的結果產生:
<person>
<firstname>1234567890</firstname>
<lastname>The BFG</lastname>
<address>5</address>
</person>
可以在架構中的順序的知識被硬編碼在XSLT樣式表,否則就必須從發現架構? – Dabbler
此外,XML和模式之間存在「Person」的個案不匹配;這是一個錯字嗎? –