私は XSD に不慣れで、次の着信 XML メッセージを検証する XSD を作成するのが困難です。
私が抱えている困難は次のとおりです。
- 属性「position」の値が「FirstName」または「LastName」に等しいデータ要素「Field」が存在する必要があり、一度だけ表示されます。
- "MiddleName" に等しい属性 "position" 値を持つデータ要素 "Field" はオプションです。また、出現する場合は、一度しか出現できません。
- 日付要素「フィールド」には、これらの 3 つのサブ要素しかありません。「MiddleName」が存在しない場合は 2 つです。
それを行うアイデアはありますか?
検証に XSD が必要な受信元の XML。
<Message>
<MessageTypeIndicator version="1" class="8" function="2" origin="3"/>
<Fields>
<Field position="FirstName">Jason</Field>
<Field position="LastName">Smith</Field>
<Field position="MiddleName">dk</Field>
</Fields>
</Message>
後で、元の XML を次のようなものに変換する XSLT も作成します。
<Person>
<MessageTypeIndicator>
<version>1</version>
<class>8</class>
<function>2</function>
<origin>3</origin>
</MessageTypeIndicator>
<FirstName>Jason</FirstName>
<LastName>Smith</LastName>
<MiddleName>dk</MiddleName>
</Person>
以下は、検証なしでこれまでに作成した xslt です。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet>
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<Message>
<MessageTypeIndicator>
<version>
<xsl:value-of select="Message/MessageTypeIndicator/@version"/>
</version>
<class>
<xsl:value-of select="Message/MessageTypeIndicator/@class"/>
</class>
<function>
<xsl:value-of select="Message/MessageTypeIndicator/@function"/>
</function>
<origin>
<xsl:value-of select="Message/MessageTypeIndicator/@origin"/>
</origin>
</MessageTypeIndicator>
<xsl:for-each select="Message/Fields/Field">
<xsl:if test="@position='FirstName'">
<FirstName>
<xsl:value-of select="string(.)"/>
</FirstName>
</xsl:if>
<xsl:if test="@position='LastName'">
<LastName>
<xsl:value-of select="string(.)"/>
</LastName>
</xsl:if>
<xsl:if test="@position='MiddleName'">
<MiddleName>
<xsl:value-of select="string(.)"/>
</MiddleName>
</xsl:if>
</xsl:for-each>
</Message>
</xsl:template>
</xsl:stylesheet>