У меня есть значение 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)?