由于我是xslt / xsd-programming的初学者,我使用XMLSpy来创建xml2xml转换。对于这两个xml我都有一个xsd。不幸的是,以下代码段无效。
<xsl:template match="/">
<table xsi:noNamespaceSchemaLocation="table.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:for-each select="table/body/line">
<row>
</row>
</xsl:for-each>
</table>
</xsl:template>
错误消息显示表格后面是行元素
详细信息(已翻译):元素<xsl:for-each>
不期望元素<table>
的{anonymous}类型。
可以通过删除对xsd的引用或删除for-each语句来解决问题
但是,我无法弄清楚出了什么问题。据我所知,for-each-loops应该只重复第一个xml中每一行的<row>
标签
这是目标的xsd的一部分。
<xs:element name="table">
<xs:complexType>
<xs:sequence>
<xs:element ref="row" maxOccurs="unbounded"/>
<xs:element ref="Metadata" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
答案 0 :(得分:1)
我怀疑Altova正在使用属性xsi:noNamespaceSchemaLocation="table.xsd"
作为信号,意思是“请根据table.xsd中的模式验证此元素”;这不是你想要的,因为它对该模式无效,因为它包含创建所需元素的XSLT指令,而不是包含所需的元素。
要解决此问题,请尝试使用xsl:attribute:
生成属性 <table xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:attribute name="xsi:noNamespaceSchemaLocation">table.xsd</xsl:attribute>
<xsl:for-each select="table/body/line">
<row/>
</xsl:for-each>
</table>