Как мне написать условия "if elsif", используя базовый XPath?
У меня есть очень простой XML и я хотел написать запрос Xpath, чтобы получить значение. Вот XML:
<?xml version="1.0" encoding="UTF-8"?>
<person>
<address>
<type>STD</type>
<key>1234</key>
</address>
<address>
<type>BA</type>
<key>1234</key>
</address>
<phone>
<type>TEL</type>
<key>1234</key>
<telephonenum>7</num>
</phone>
<phone>
<type>TEL</type>
<key>1234</key>
<telephonenum>8</num>
</phone>
<phone>
<type>TEL</type>
<key>1234</key>
<telephonenum>9</num>
</phone>
</person>
Вот условия, которые у меня есть:
If (/person/address[type = "STD"]/addresskey = and /person/address[type = "BA"/addresskey )
тогда я должен получить /person/phone[2]/telephonenum
, Если этот второй телефонный номер не существует, он должен получить первый телефонный номер.
1 ответ
Вот условия, которые у меня есть:
If (/person/address[type = "STD"]/addresskey = and /person/address[type = "BA"/addresskey )
тогда я должен получить
/person/phone[2]/telephonenum
, Если этот второй телефонный номер не существует, он должен получить первый телефонный номер.
Я думаю, что по addresskey
ты имеешь ввиду просто key
(здесь нет addresskey
элемент в предоставленном XML).
Кроме того, XML не очень хорошо сформирован, и мне пришлось исправить, т.е.
Теперь давайте обратимся к заявленным требованиям:
Первый:
Я должен получить
/person/phone[2]/telephonenum
,
Переводит на это:
/*/phone[2]
Затем:
Если этот второй телефонный номер не существует, он должен получить первый телефонный номер.
Изменяет вышеприведенное выражение к этому:
/*/phone[not(position() >2)][last()]
В заключение:
If (/person/address[type = "STD"]/addresskey = and /person/address[type = "BA"/addresskey )
полное выражение становится:
/*/phone[not(position() >2)][last()]
[/*/address[type = 'STD']/key
=
/*/address[type = 'BA']/key
]
Проверка на основе XSLT:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/phone[not(position() >2)][last()]
[/*/address[type = 'STD']/key
=
/*/address[type = 'BA']/key
]
"/>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к предоставленному (и исправленному) XML:
<person>
<address>
<type>STD</type>
<key>1234</key>
</address>
<address>
<type>BA</type>
<key>1234</key>
</address>
<phone>
<type>TEL</type>
<key>1234</key>
<telephonenum>7</telephonenum>
</phone>
<phone>
<type>TEL</type>
<key>1234</key>
<telephonenum>8</telephonenum>
</phone>
<phone>
<type>TEL</type>
<key>1234</key>
<telephonenum>9</telephonenum>
</phone>
</person>
нужный узел выбран и выводится:
<phone>
<type>TEL</type>
<key>1234</key>
<telephonenum>8</telephonenum>
</phone>
II. XPath 2.0 выражение:
for $check in
/*/address[type = 'STD']/key[1]
eq
/*/address[type = 'BA']/key[1],
$p1 in /*[$check]/phone[1],
$p2 in /*[$check]/phone[2]
return
($p2, $p1)[1]