Как мне написать условия if ifsif, используя базовый XPath? - PullRequest
2 голосов
/ 19 января 2012

У меня есть очень простой 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 Ответ

0 голосов
/ 19 января 2012

Вот условия, которые у меня есть:

If (/person/address[type = "STD"]/addresskey = and /person/address[type = "BA"/addresskey )

тогда я должен получить /person/phone[2]/telephonenum. Если этот второй номер телефона не существует, тогда он должен получить первый телефон число.

Я предполагаю, что под addresskey вы подразумеваете просто key (в предоставленном XML нет элемента addresskey).

Кроме того, 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]
...