Удаление узлов из xml, когда атрибут и текстовое содержимое совпадают с использованием xslt 2.0 - PullRequest
0 голосов
/ 20 мая 2018

У меня проблемы с преобразованием XML.Вот мой xml:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <organisation>
        <school>
            <name>school of arts Berlin</name>
            <address>123street</address>
        </school>
    </organisation>
    <teachers>
        <wo_number>34A</wo_number>
        <publication>
            <date>14-09-2018</date>
            <name>J. doe</name>
        </publication>
        <teacher id="A254">
            <situation>
                <ill>yes</ill>
            </situation>
        </teacher>
        <teacher id="A254">
            <situation>
                <ill>no</ill>
            </situation>
        </teacher>
        <teacher id="B254">
            <situation>
                <ill>probable</ill>
            </situation>
        </teacher>
        <teacher id="X92">
            <situation>
                <ill>no</ill>
            </situation>
        </teacher>
        <teacher id="G56">
            <situation>
                <ill>probable</ill>
            </situation>
        </teacher>
        <teacher id="G56">
            <situation>
                <ill>yes</ill>
            </situation>
        </teacher>
    </teachers>
</root>

Чего я пытаюсь достичь:

  • Элемент учителя имеет идентификатор атрибута, если он начинается с «А2» И текстовое содержимоеэлемент ill в том же узле учителя равен "yes". Элемент учителя должен быть удален
  • элемент учителя имеет идентификатор атрибута, если он начинается с "G5" И текстовое содержимое элемента ill в том же учителеузел, равный «вероятному», узел учителя должен быть удален

правильный результат должен быть:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <organisation>
        <school>
            <name>school of arts Berlin</name>
            <address>123street</address>
        </school>
    </organisation>
    <teachers>
        <wo_number>34A</wo_number>
        <publication>
            <date>14-09-2018</date>
            <name>J. doe</name>
        </publication>
        <teacher id="A254">
            <situation>
                <ill>no</ill>
            </situation>
        </teacher>
        <teacher id="B254">
            <situation>
                <ill>probable</ill>
            </situation>
        </teacher>
        <teacher id="X92">
            <situation>
                <ill>no</ill>
            </situation>
        </teacher>
        <teacher id="G56">
            <situation>
                <ill>yes</ill>
            </situation>
        </teacher>
    </teachers>
</root>

, пока я не смог этого добиться.Я застрял в первом (требовании) булле, написанном выше.Вот мой xslt:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!--xsl:template match="teachers"-->
<xsl:output omit-xml-declaration="yes"/>

<xsl:param name="teacher-to-remove" select="'yes'"/>

<xsl:template match="node()|@*" name="identity">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="teacher">
        <xsl:if test="(not(contains(concat(',', $teacher-to-remove, ','), concat(',', situation/ill, ','))) and not(starts-with(@id, 'A2')))">   
            <xsl:call-template name="identity"/>
        </xsl:if>
</xsl:template>

с таким результатом:

    <root>
        <organisation>
            <school>
                <name>school of arts Berlin</name>
                <address>123street</address>
            </school>
        </organisation>
        <teachers>
            <wo_number>34A</wo_number>
            <publication>
                <date>14-09-2018</date>
                <name>J. doe</name>
            </publication>


            <teacher id="B254">
                <situation>
                    <ill>probable</ill>
                </situation>
            </teacher>
            <teacher id="X92">
                <situation>
                    <ill>no</ill>
                </situation>
            </teacher>
            <teacher id="G56">
                <situation>
                    <ill>probable</ill>
                </situation>
            </teacher>

        </teachers>
    </root>

Все узлы учителя с элементом <ill>yes</ill> удалены, что не правильно, и все учителяудаляются узлы с идентификатором A254, что также неверно.xsl: если условие не работает так, как я ожидал (или хотел).Некоторая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 20 мая 2018

Это можно сделать с помощью двух пустых шаблонов:

<xsl:template match="teacher[starts-with(@id,'A2') and situation/ill='yes']" />
<xsl:template match="teacher[starts-with(@id,'G5') and situation/ill='probable']" />

Они отфильтровывают нежелательные элементы.

...