Удаление элементов из узлов или узлов из XML, когда атрибут и текстовое содержимое совпадают с использованием xslt 2.0 - PullRequest
0 голосов
/ 21 мая 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>
            <situation>
                <ill>no</ill>
            </situation>
            <situation>
                <ill>probable</ill>
            </situation>
        </teacher>
        <teacher id="A254">
            <situation>
                <ill>yes</ill>
            </situation>
            <situation>
                <ill>yes</ill>
            </situation>
        </teacher>
        <teacher id="B254">
            <situation>
                <ill>probable</ill>
            </situation>
        </teacher>
        <teacher id="X92">
            <situation>
                <ill>no</ill>
            </situation>
            <situation>
                <ill>probable</ill>
            </situation>
        </teacher>
        <teacher id="G56">
            <situation>
                <ill>probable</ill>
            </situation>
            <situation>
                <ill>no</ill>
        </situation>
        </teacher>
        <teacher id="G56">
            <situation>
                <ill>yes</ill>
            </situation>
        </teacher>
        <teacher id="G56">
            <situation>
                <ill>probable</ill>
            </situation>
        </teacher>
    </teachers>
</root>

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

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

, правильный результат должен быть следующим:

<?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>
            <situation>
                <ill>probable</ill>
            </situation>
        </teacher>
        <teacher id="B254">
            <situation>
                <ill>probable</ill>
            </situation>
        </teacher>
        <teacher id="X92">
            <situation>
                <ill>no</ill>
            </situation>
            <situation>
                <ill>probable</ill>
            </situation>
        </teacher>
        <teacher id="G56">
            <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:output omit-xml-declaration="yes"/>

      <xsl:template match="node()|@*">
          <xsl:copy>
              <xsl:apply-templates select="node()|@*"/>
          </xsl:copy>
      </xsl:template>
      <xsl:template match="teacher[starts-with(@id,'A2') and situation/ill='yes']"/>
      <xsl:template match="teacher[starts-with(@id,'G5') and situation/ill='probable']"/>
    </xsl:stylesheet>

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

    <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>yes</ill>
                </situation>
            </teacher>

        </teachers>
    </root>

Все узлы учителя с id="A254" удалены, что неверно, и узлы учителя с id="G56" удалены, чтотакже не правильно. Некоторая помощь будет высоко ценится.

Ответы [ 3 ]

0 голосов
/ 21 мая 2018
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="root">
        <xsl:element name="root">
        <xsl:element name="organisation">
            <xsl:element name="school">
                <xsl:element name="name">
                    <xsl:value-of select="organisation/school/name"/>
                </xsl:element>
                <xsl:element name="address">
                    <xsl:value-of select="organisation/school/address"/>
                </xsl:element>
            </xsl:element>
        </xsl:element>
        <xsl:element name="teachers">
            <xsl:element name="wo_number">
                <xsl:value-of select="teachers/wo_number"/>
            </xsl:element>
            <xsl:element name="publication">
                <xsl:element name="date">
                    <xsl:value-of select="teachers/publication/date"/>
                </xsl:element>
                <xsl:element name="name">
                    <xsl:value-of select="teachers/publication/name"/>
                </xsl:element>
            </xsl:element>


        <xsl:for-each select="teachers/teacher">
            <xsl:choose>
                <xsl:when test=" starts-with(@id,'A2')">
                    <xsl:choose>
                        <xsl:when test="situation/ill='no'">
                            <xsl:element name="teacher">
                                <xsl:attribute name="id">
                                    <xsl:value-of select="@id"/>
                                </xsl:attribute>

                            <situation>
                                <xsl:element name="ill">
                                    <xsl:value-of select="situation[ill='no']"/>
                                </xsl:element>
                            </situation>
                            <situation>
                                <xsl:element name="ill">
                                    <xsl:value-of select="situation[ill='probable']"/>
                                </xsl:element>
                            </situation>
                            </xsl:element>
                        </xsl:when>

                        <xsl:when test="situation/ill='yes'"/>
                    </xsl:choose>   
                </xsl:when>
                <!--<xsl:when test=" starts-with(@id,'A2') and situation/ill='yes'"/>-->

                <xsl:when test="starts-with(@id,'G5')">
                    <xsl:choose>

                        <xsl:when test="situation/ill='no'">
                            <xsl:element name="teacher">
                                <xsl:attribute name="id">
                                    <xsl:value-of select="@id"/>
                                </xsl:attribute>

                                <situation>
                                    <xsl:element name="ill">
                                        <xsl:value-of select="situation[ill='no']"/>
                                    </xsl:element>
                                </situation>
                            </xsl:element>
                        </xsl:when>
                        <xsl:when test="situation/ill='yes'">
                            <xsl:element name="teacher">
                                <xsl:attribute name="id">
                                    <xsl:value-of select="@id"/>
                                </xsl:attribute>

                                <situation>
                                    <xsl:element name="ill">
                                        <xsl:value-of select="situation[ill='yes']"/>
                                    </xsl:element>
                                </situation>
                            </xsl:element>
                        </xsl:when>
                        <xsl:when test="situation/ill='probable'"/>
                    </xsl:choose>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:copy-of select="."/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each>
        </xsl:element>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>
0 голосов
/ 21 мая 2018

В качестве альтернативы, поскольку вы ищете решение для XSLT 2, возможно, вы используете Saxon 9 или Altova, где последние версии также поддерживают XSLT 3, вы можете использовать XSLT 3 xsl:where-populated https://www.w3.org/TR/xslt-30/#element-where-populated дляубедитесь, что только те элементы teacher, которые создают контент с обработкой своих дочерних элементов, создают выходные данные:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="3.0">

  <xsl:strip-space elements="*"/>
  <xsl:output indent="yes"/>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="teacher[starts-with(@id, 'A2')] | teacher[starts-with(@id, 'G5')]">
      <xsl:where-populated>
          <xsl:next-match/>
      </xsl:where-populated>
  </xsl:template>

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

</xsl:stylesheet>

Онлайн-демонстрация по адресу https://xsltfiddle.liberty -development.net / gWmuiJ9 .

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

Это решение требует небольшой подстройки пустых шаблонов.

Первые два шаблона проверяют, есть ли у элемента teacher все значения yes или probable в situation/ill дочерних элементах, и если это так, удалите их.Проверка выполняется путем сравнения количества дочерних элементов с количеством совпадающих дочерних элементов.

Другие два шаблона проверяют наличие элементов situation, которые имеют только один элемент ill, содержащий yes или probable.Если это так, удаляется только элемент situation, а не весь элемент teacher.

<xsl:template match="teacher[starts-with(@id,'A2') and situation/ill='yes' and count(situation[ill='yes']) = count(situation/ill)]" />      
<xsl:template match="teacher[starts-with(@id,'G5') and situation/ill='probable' and count(situation[ill='probable']) = count(situation/ill)]" />
<xsl:template match="situation[starts-with(../@id,'A2') and ill='yes']"/>      
<xsl:template match="situation[starts-with(../@id,'G5') and ill='probable']"/>   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...