例如,假设我有一个用于描述会议的XML文件,该会议最后将进行表决,并且我将其定义如下:
<meeting>
<members>
<member id="A"/>
<member id="B"/>
</members>
<vote>
<option1>
<voting_member idref="A"/>
</option1>
<option2>
<voting_member idref="B"/>
</option2>
</vote>
</meeting>
在XSL中,如何定义一个验证,例如,如果未在内部定义idref =“ C”的成员,则该表决无法阻止他进行表决?
到目前为止,我想出了一种解决方法,该方法对列表中的成员和投票中的成员进行计数,并发出警告,警告这些计数不匹配:
<xsl:if test="count(meeting/members)!=sum(count(meeting/vote/option1),count(meeting/vote/option2))"> Warning: mismatch </xsl:if>
但是我需要验证ID本身,以防止在会议中未定义的成员被允许投票的情况下如何实现?
预先感谢
答案 0 :(得分:1)
我明白了。
<xsl:if test="meeting/vote/option1/@idref!=meeting/members/member/@id">
Warning
</xsl:if>
答案 1 :(得分:0)
解决交叉引用的最佳方法是使用 key -例如:
XML
<meeting>
<members>
<member id="A"/>
<member id="B"/>
</members>
<vote>
<option1>
<voting_member idref="A"/>
</option1>
<option2>
<voting_member idref="B"/>
</option2>
<option3>
<voting_member idref="C"/>
</option3>
</vote>
</meeting>
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="member" match="member" use="@id" />
<xsl:template match="/meeting">
<root>
<xsl:variable name="non-members" select="vote/*/voting_member[not(key('member', @idref))]" />
<xsl:if test="$non-members">
<message>
<xsl:text>WARNING: </xsl:text>
<xsl:value-of select="count($non-members)"/>
<xsl:text> non-members are listed as having voted.</xsl:text>
</message>
</xsl:if>
</root>
</xsl:template>
</xsl:stylesheet>
结果
<?xml version="1.0" encoding="UTF-8"?>
<root>
<message>WARNING: 1 non-members are listed as having voted.</message>
</root>