Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / XML, XSL, XPath, XQuery Новый топик    Ответить
 Условие внутри условия в Xpath.  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Привет.

Возможно ли в Xpath писать условие внутри условия ? Некий аналог операции In/Exist.

У меня есть некий Node1 - ссылка на него. Это все, что я имею для начала. У него есть несколько Childs1. Их имена константные. Т.е, это некий справочник с заранее известными элементами.

<Node1>
 <Element id = "111">
   ...
 <Element>
 <Element id = "222">
   ...
 <Element>
 <Element id = "333">
   ...
 <Element>
</Node1>

Мне нужно найти Childs2 в Node2 у который аттрибут Id элементов, полученных из Childs1.


Сейчас мне приходится в коде это реализовывать через цикл. Который сначала делает SelectNodes и вытаскивает все Childs1. А затем уже вызывать отдельные Xpath для каждого из них.

Очень хотелось бы получить более красивое решение, когда один Xpath сам достает все, что нужно.
18 ноя 15, 18:10    [18437281]     Ответить | Цитировать Сообщить модератору
 Re: Условие внутри условия в Xpath.  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Я в принципе через цикл пока сделал.
Но вопрос мне интересен.

Подозреваю, что так сделать не получится ?
Вообще, проблемы 2:
1. Условие внутри условия. Разрешены ли ?
2. То, что в условии будет не строгое равенство (@a=@b), а аналог операции In/Exist (@a in (select from @B)).

Подозреваю, что в Xpath такое не реализуемо. Однако может я просто не знаю, и решение имеется.
19 ноя 15, 11:32    [18439785]     Ответить | Цитировать Сообщить модератору
 Re: Условие внутри условия в Xpath.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12881
ProBiotek
1. Условие внутри условия. Разрешены ли ?
Да
ProBiotek
2. То, что в условии будет не строгое равенство (@a=@b), а аналог операции In/Exist (@a in (select from @B)).
немного непонятно. Покажите XML и, что нужно вітянуть
19 ноя 15, 18:09    [18443002]     Ответить | Цитировать Сообщить модератору
 Re: Условие внутри условия в Xpath.  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
_Vasilisk_,

Структура такая.

<Node1>
 <Element id = "111">
   ...
 <Element>
 <Element id = "222">
   ...
 <Element>
 <Element id = "333">
   ...
 <Element>
</Node1>


<Node2>
 <Data id = "111">
   ...
 <Data>
 <Data id = "222">
   ...
 <Data>
 <Data id = "333">
   ...
 <Data>
 <Data id = "444">
   ...
 <Data>
</Node2>



Node1 - это некий элемент, который я получаю на вход.
Нужно собрать все его Elements.

Затем нужно найти тэг Node2 XPath: имя известно (константа) и известен его атрибут ID. И затем нужно вытащить все его Datas у которых ID совпадает с теми, что были уже взяты из Elements (таким образом, в представленном XML, не должен быть извлечен Data с id="444")
Поэтому я и сказал, что нужен некий аналог операции IN из SQL.

Сейчас я это делаю через циклы в C# - иду по собранным Elements и извлекаю по одному элементы Data.
Все работает, но хочется, чтобы все было одних XPath'ом.
20 ноя 15, 11:01    [18445776]     Ответить | Цитировать Сообщить модератору
 Re: Условие внутри условия в Xpath.  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
по сути тут происходит Inner Join :) Связка один к одному.
20 ноя 15, 12:24    [18446569]     Ответить | Цитировать Сообщить модератору
 Re: Условие внутри условия в Xpath.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12881
ProBiotek
Все работает, но хочется, чтобы все было одних XPath'ом.
Нельзя одним запросом вытащить два набора узлов
20 ноя 15, 16:10    [18448429]     Ответить | Цитировать Сообщить модератору
 Re: Условие внутри условия в Xpath.  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
_Vasilisk_,

Ну мне нужен набор из элементов Data. Но их ID должны соответствовать тем, что в тэгах Element. А всю цепочку начинаем раскручивать начиная с одного нода: Node1.

Это все не реализуемо ?
20 ноя 15, 17:53    [18449152]     Ответить | Цитировать Сообщить модератору
 Re: Условие внутри условия в Xpath.  [new]
Фридрих
Member

Откуда:
Сообщений: 130
ProBiotek,
не уверен что правильно понял задачу, но сделал одним Xpath выражением, правда пришлось малость подправить сам XML и использовал XSL для проверки
+
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="root.xsl"?>
<table>  
<Node1>
 <Element id = "111">
   <boss>1111</boss>
 </Element>
 <Element id = "222">
  <boss>2222</boss>
 </Element>
 <Element id = "333">
  <boss>3333</boss>
 </Element>
</Node1>

<Node2>
 <Data id = "111">
  <boss>1111</boss>
 </Data>
 <Data id = "222">
  <boss>2222</boss>
 </Data>
 <Data id = "333">
  <boss>3333</boss>
 </Data>
 <Data id = "444">
  <boss>4444</boss>
 </Data>
</Node2>
</table>

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<ff>
   <xsl:copy-of select="table/Node2/Data[@id = ../../Node1/Element/@id]"/>
</ff>
</xsl:template>

</xsl:stylesheet>


table/Node2/Data[@id = ../../Node1/Element/@id]
19 дек 15, 22:26    [18583331]     Ответить | Цитировать Сообщить модератору
 Re: Условие внутри условия в Xpath.  [new]
anvg
Member

Откуда: СПб
Сообщений: 101
Доброе время суток
Фридрих, да, спасибо работает
Public Sub testsel()
    Dim pDoc As New MSXML2.DOMDocument60, pItems As MSXML2.IXMLDOMSelection
    Dim pItem As MSXML2.IXMLDOMElement
    pDoc.Load "c:\Path\text.xml"
    Set pItems = pDoc.SelectNodes("/table/Node2/Data[@id=/table/Node1/Element/@id]")
    For Each pItem In pItems
        Debug.Print pItem.getAttribute("id")
    Next
End Sub
28 дек 15, 09:44    [18616952]     Ответить | Цитировать Сообщить модератору
Все форумы / XML, XSL, XPath, XQuery Ответить