下面是一個XSLT 1.0選項,其中顯示合格/不合格。 「失敗」中還有其他詳細信息,但可以刪除。它還將消息輸出到stdout和stderr並終止處理。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/Manager">
<xsl:if test="not(count(Employee) >= @mincount)">
<xsl:variable name="vMessage" select="concat('Fail - Number of Employees (',count(Employee),') is not >= to @mincount (',@mincount,').')"/>
<!--stdout-->
<xsl:value-of select="$vMessage" disable-output-escaping="yes"/>
<!--stderr-->
<xsl:message terminate="yes"><xsl:value-of select="$vMessage"/></xsl:message>
</xsl:if>
<xsl:if test="Employee/@grade >= @grade">
<xsl:variable name="vMessage" select="concat('Fail - Employee (id ',Employee[@grade >= ancestor::Manager/@grade][1]/@id,') has a grade (',Employee[@grade >= ancestor::Manager/@grade][1]/@grade,') that is higher than the Manager grade (',@grade,').')"/>
<!--stdout-->
<xsl:value-of select="$vMessage" disable-output-escaping="yes"/>
<!--stderr-->
<xsl:message terminate="yes"><xsl:value-of select="$vMessage"/></xsl:message>
</xsl:if>
<xsl:text>Pass</xsl:text>
</xsl:template>
</xsl:stylesheet>
這裏有一些XML /輸出的例子:
<Manager mincount="1" grade="7" id="28">
<Employee id="6" grade="5"/>
<Employee id="7" grade="1"/>
<Employee id="8" grade="2"/>
<Employee id="3" grade="7"/>
</Manager>
Fail - Employee (id 3) has a grade (7) that is higher than the Manager grade (7).
<Manager mincount="1" grade="7" id="28">
<Employee id="6" grade="5"/>
<Employee id="7" grade="1"/>
<Employee id="8" grade="2"/>
<Employee id="3" grade="6"/>
</Manager>
Pass
<Manager mincount="10" grade="7" id="28">
<Employee id="6" grade="5"/>
<Employee id="7" grade="1"/>
<Employee id="8" grade="2"/>
<Employee id="3" grade="6"/>
</Manager>
Fail - Number of Employees (4) is not >= to @mincount (10).
+1 XSLT用於XML文檔的轉換。 本教程應該很好的學習如何驗證 – 2012-02-16 06:17:28
加入傢伙,同時提供符合Foo Bar要求的XSD代碼片段。 – Maestro13 2012-02-16 06:37:28
據我所知,在XSD規範中,只能提供等於非負整數的minOccurs屬性值。但是這裏需要引用父元素中的屬性。 是否有更新版本的XSD,我不知道,可以做到這一點? 如果不是,那麼這個問題是有效的,適用於XSLT。 – Maestro13 2012-02-16 07:14:17