XSLT - предотвращение ссылки на неопределенный элемент - PullRequest
0 голосов
/ 17 ноября 2018

Скажем, например, у меня есть 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>

Но мне нужно проверить сами идентификаторы, чтобы предотвратить ситуации, когда участнику, который не определен на собрании, разрешено голосовать, как мне это сделать?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Лучший способ разрешить перекрестные ссылки - использовать ключ - например:

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>
0 голосов
/ 17 ноября 2018

Я понял.

<xsl:if test="meeting/vote/option1/@idref!=meeting/members/member/@id">
    Warning
</xsl:if>
...