XSLT-防止引用未定义的元素

时间:2018-11-17 01:32:11

标签: xml xslt xsd xslt-1.0 xslt-2.0

例如,假设我有一个用于描述会议的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本身,以防止在会议中未定义的成员被允许投票的情况下如何实现?

预先感谢

2 个答案:

答案 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>