Как получить самый длинный путь XPath-запроса, содержащийся в XML? - PullRequest
0 голосов
/ 11 мая 2011

У меня есть значение XML и запрос XPath, например:

XML:

<Firms>
    <Firm id="1" select="1" update="1" insert="1" delete="1">
        <Backoffice select="1" update="1" insert="1" delete="1">
            <Transaction select="1" update="1" insert="1" delete="0">
                <DatePeriod startDate="20110101" endDate="20110505" select="1" update="0" insert="0" delete="0"/>
                <DatePeriod startDate="20100101" endDate="20110101" select="0" update="0" insert="0" delete="0"/>
            </Transaction>
        </Backoffice>
    </Firm>
</Firms>

XPath:

./Firms/Firm[@id="1"]/Backoffice/Transaction/DatePeriod

Iхотите получить значения самого длинного префикса XPath, содержащегося в XML .

В моем примере значения были бы:

<DatePeriod startDate="20110101" endDate="20110505" select="1" update="0" insert="0" delete="0"/>
<DatePeriod startDate="20100101" endDate="20110101" select="0" update="0" insert="0" delete="0"/>

Если мы изменим XPath на

./Firms/Firm[@id="1"]/Backoffice/Client/Account

, ожидаемый результат должен быть

<Firms>
    <Firm id="1" select="1" update="1" insert="1" delete="1">
        <Backoffice select="1" update="1" insert="1" delete="0"/>
    </Firm>
</Firms>

Позвольте мне объяснить, что происходит.XML описывает привилегии пользователя, XPath описывает контекст безопасности (защищаемый объект).Сначала мы пытаемся выяснить, существует ли точное правило об объекте (./Firms/Firm[@id="1"]/Backoffice/Client/Account) и проверить ожидаемые права (выбрать, вставить или обновить).Если мы не найдем его, мы переходим на родительский уровень (./Firms/Firm[@id="1"]/Backoffice/Client) и пытаемся применить правила верхнего уровня (если они существуют).И так далее.Наконец, мы находим существующий уровень (./Firms/Firm[@id="1"]/Backoffice) и видим, что родительское правило дает нам права выбирать, обновлять, но не удалять.

Есть ли способ реализовать этологика через XPath (для SQL Server 2008)?

Ответы [ 3 ]

2 голосов
/ 11 мая 2011

XPath может выбирать только те узлы, которые присутствуют в вашем документе, но не может их изменять.Ваш вход содержит узел BackOffice, у которого есть дочерние элементы, но желаемый вывод показывает узел BackOffice без дочерних элементов.Это означает, что узел был изменен, и, следовательно, это не может быть сделано с XPath - ему нужен XSLT или XQuery.

(Кстати, я понятия не имею, что вы подразумеваете под "длинным путем" или"самый длинный префикс".)

1 голос
/ 11 мая 2011

Нужно ли выполнять префикс «сопоставление» в одном запросе XPath?Это кажется невозможным из-за функциональной природы XPath.Существуют условные выражения для проверки наличия подрезультатов, но нет условного ветвления.

С другой стороны, программное удаление шагов местоположения от конца до получения непустого результата кажется простым.

1 голос
/ 11 мая 2011

Единственный способ, которым я могу думать об этом, это программно пробовать и терпеть неудачу:

  1. вы строите свое самое специфическое выражение XPath (./Firms/Firm[@id="1"]/Backoffice/Client/Account); давайте назовем это X

  2. вы используете X для поиска подходящих узлов; если вы найдете что-то, то вы закончили, в противном случае вы переходите к шагу 3.

  3. если вы можете обобщить X, удалив последнюю часть, то сделайте это и перейдите к шагу 2; в противном случае вы не сможете найти совпадения в своем XML и, возможно, захотите выдать ошибку.

Не могу помочь, как это сделать с SQL Server 2008, извините.

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