こんにちわ。
自己レスです。
まだ私がxmlをよく理解していないのですが、どうやら名前空間の指定がよくなかったみたいです。
以前の投稿では、以下のようにxmlファイルにxmlns="http://tempuri.org/PersonDataSet.xsd"を付けたしてスキーマを宣言して実行するとエラーが発生していました。
<?xml version="1.0" standalone="yes"?>
<DataSet xmlns="http://tempuri.org/Person.xsd">
<Person>
<name>Taro</name>
<age>18</age>
</Person>
<Person>
<name>Ziro</name>
<age>20</age>
</Person>
</DataSet>
そこで、この指定を外して以下のようにするとうまくいきました。
----------------------
xmlファイル
----------------------
<?xml version="1.0" standalone="yes"?>
<PersonDataSet>
<Person>
<name>Taro</name>
<age>18</age>
</Person>
<Person>
<name>Ziro</name>
<age>20</age>
</Person>
</PersonDataSet>
----------------------
xslファイル
----------------------
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/PersonDataSet">
<DataSet>
<xsl:apply-templates/>
</DataSet>
</xsl:template>
<xsl:template match="Person">
<Person>
<xsl:attribute name="name">
<xsl:value-of select="name"/>
</xsl:attribute>
</Person>
</xsl:template>
</xsl:stylesheet>
----------------------
xsdファイル
----------------------
<?xml version="1.0" standalone="yes"?>
<xs:schema id="PersonDataSet" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified">
<xs:element name="PersonDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Person">
<xs:complexType>
<xs:sequence>
<xs:element name="name" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="age" type="xs:int" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
----------------------
Aspのソース
----------------------
<asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="XmlDataSource1" DataTextField="name" DataValueField="name">
</asp:DropDownList>
<asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/App_Data/person.xml"
TransformFile="~/App_Data/person.xsl">
</asp:XmlDataSource>
DataSetクラスのReadXmlSchema()とReadXml()を使ってxmlファイルを読み込んで見てみると、ちゃんとスキーマで指定した制約が効いているようです。
ということで、
> どうやら、xslで変換後のxmlに対してもスキーマの定義が効いてるようで、スキーマで定義した形式以外のxmlにしようとしていることからエラーがでてるようです。
については、完全に私の勘違いです。
xmlやxmlsnなどについて、私にはもう少し勉強が必要そうですorz
xmlファイルにxmlsnを追加したらなぜエラーが発生するのか、そしてxmlファイルにxmlsnを指定した場合にはxlsにはどのように指定しなければいけないのか、という疑問については、また何かわかれば投稿しようと思いますが、とりあえずは解決済みにしておきます。
|