PullRequest
       0

0 голосов
/ 24 февраля 2020

Я добавляю дополнительное условие к существующей таблице стилей xsl.

Упрощенный XML входной контент выглядит следующим образом:

<form id="MY_CONTENT">
<variable id="processInfo">
    <variable id="teacher">
        <variable id="taxId" value="12345"/>
        <variable id="name" value="Nancy"/>
    </variable>
    <variable id="student">
        <variable id="taxId" value="12345"/>
        <variable id="name" value="Nancy"/>
    </variable>
    <variable id="student">
        <variable id="taxId" value="23456"/>
        <variable id="name" value="Will"/>
        <variable id="tutoringtInformation">
            <variable id="specialNeeds">
                <variable id="description" value="Special Need"/>
            </variable>
        </variable>
    </variable>
    <variable id="student">
        <variable id="taxId" value="98765"/>
        <variable id="name" value="Dustin"/>
        <variable id="tutoringtInformation">
            <variable id="preferences">
                <variable id="reason" value="Mornings"/>
            </variable>
        </variable>
    </variable>
    <variable id="student">
        <variable id="taxId" value="784512"/>
        <variable id="name" value="Steve"/>
        <variable id="tutoringtInformation">
            <variable id="available" value="false"/>
        </variable>
    </variable>
</variable>

Сейчас xslt только отфильтровывает элементы типа «student», чей taxId отличается от taxId для элемента «teacher».

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <result>
            <xsl:for-each select="/form/variable[@id = 'processInfo']/variable[@id = 'student' and variable[@id = 'taxId']/@value != ../variable[@id = 'policyHolder']/variable[@id = 'taxId']/@value]">
                <xsl:variable name="taxId" select="variable[@id = 'taxId']/@value"/>

                <resultSet>
                        <xsl:copy-of select="/form/variable[@id = 'processInfo']/variable[@id = 'student' and variable[@id = 'taxId']/@value = $taxId]"/>
                        <xsl:copy-of select="/form/variable[@id = 'processInfo']/variable[@id != 'student']"/>
                    <xsl:copy-of select="/form/variable[@id != 'processInfo']"/>
                </resultSet>
            </xsl:for-each>
        </result>
    </xsl:template>
</xsl:stylesheet>

Наряду с этим условием я также хочу отфильтровать student элементы, которые не имеют какое-либо из следующих условий (или):

  • дочерний элемент tutoringtInformation , который имеет дочерний элемент specialNeeds
  • дочерний элемент tutoringtInformation , который имеет дочерний элемент предпочтения

На входе XML он должен вывести и Уилл, и Дастин. Как я могу добиться такого поведения?

1 Ответ

1 голос
/ 24 февраля 2020

Ваше словесное описание «дочерний элемент tutoringtInformation, который имеет дочерний элемент specialNeeds» переводится в XPath tutoringtInformation/specialNeeds, только у вас нет дочерних элементов, названных в соответствии с типом данных, который они представляют, но только variable элементы с id атрибут, обозначающий этот тип, так что вы скорее хотите variable[@id = 'tutoringtInformation']/variable[@id = 'specialNeeds']. Если вы помещаете это в предикат (то есть в квадратные скобки variable[@id = 'student'][variable[@id = 'tutoringtInformation']/variable[@id = 'specialNeeds']]), вы проверяете существование. Поскольку вы не хотите, чтобы у вашего элемента были такие дети / внуки, используйте отрицание с not(): variable[@id = 'student'][not(variable[@id = 'tutoringtInformation']/variable[@id = 'specialNeeds'])]. Вы можете добавить второе условие с помощью and или дополнительного предиката.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...