我很快就参加了考试,我认为最好的修改方法是制作一个小课程,结合我所学到的知识。所以我用一个相当简单的xml DTD制作了一个小数据集。为此,我决定使用一些随机愚蠢的最终幻想。
现在我遇到的问题是将以下XML约束转换为可用的DTD;
DTD段;
<!ELEMENTcharacter (name,gender,materialist,
game,ultimateweapon,relations) >
<!ELEMENT materialist (materia*) >
<!ELEMENT materia (mname, mtype) >
<!ELEMENT mname (#PCDATA) >
<!ELEMENT mtype (#PCDATA)>
示例XML“character”
<FFPEOPLE>
<docName>Final Fantasy Characters</docName>
<character cno="c1">
<name>Cloud</name>
<gender>Male</gender>
<materialist>
<materia>
<mname>Bahamut</mname>
<mtype>4</mtype>
</materia>
<materia>
<mname>4x Cut</mname>
<mtype>2</mtype>
</materia>
</materialist>
<game>&ff7;</game>
<ultimateweapon>Ultima Sword</ultimateweapon>
<relations>
<relation>Tifa</relation>
<relation>Aeris</relation>
</relations>
</character>
</FFPEOPLE>
我的XSL文件的相关部分;
<tr>
<th>Name</th>
<th>Gender</th>
<th>Materia 1</th>
<th>Materia 2</th>
<th>Game</th>
<th>Ultimate Weapon</th>
<th>Relations</th>
</tr>
<xsl:template match="character">
//Prior Code removed for Brevity
<xsl:apply-templates select="materialist"/>
<td>
<xsl:value-of select="game"/>
</td>
<td>
<xsl:value-of select="ultimateweapon"/>
</td>
</xsl:template>
<xsl:template match="materialist">
<xsl:for-each select="materia">
<xsl:variable name="mVar" select="position()"/>
<xsl:choose>
<xsl:when test="$mVar<'2'">
<td style="color: red; text:align: left">
<xsl:value-of select="mname"/>
</td>
</xsl:when>
<xsl:otherwise>
<td style="color: blue; padding-right:
20px; text-align: right">
<xsl:value-of select="mname"/>
</td>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
因此想象一下我的DTD所允许的用于其材料列表的字符;
<materialist>
</materialist>
我无法使事情发挥作用的是列表中材料的可选性质导致列表中没有任何内容的条目将不正确的数据放入材料1和材料2标题中。 (显然,如果我将一个模板匹配模板匹配在一个块中,这不会发生,但意味着所有材料都在一列内)。我怎么能避免这个?是不是XML DTD的设计很糟糕,我应该总是要求列表中的materia节点。或者有没有办法解决使用XSL?
谢谢(对不起,如果我提供了太多/太少的信息)!