2013-04-20 28 views
6

Nowy na Xpath. Próbowałem użyć zadania XML w SSIS do załadowania niektórych wartości. Korzystając z wykazu XML firmy Microsoft wymienionego poniżej.Jak korzystać z wielu warunków w Xpath?

Jak mogę załadować imię w księgarniach/książkach, w których styl jest nowy, a nagroda = 'Pulitzer'? //book[@style='novel' and ./author/award/text()='Pulitzer'] jest tym, co próbuję. Daje cały element. Gdzie powinienem zmodyfikować, aby uzyskać wartość imienia?

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="myfile.xsl" ?> 
<bookstore specialty="novel"> 
    <book style="autobiography"> 
    <author> 
     <first-name>Joe</first-name> 
     <last-name>Bob</last-name> 
     <award>Trenton Literary Review Honorable Mention</award> 
    </author> 
    <price>12</price> 
    </book> 
    <book style="textbook"> 
    <author> 
     <first-name>Mary</first-name> 
     <last-name>Bob</last-name> 
     <publication>Selected Short Stories of 
     <first-name>Mary</first-name> 
     <last-name>Bob</last-name> 
     </publication> 
    </author> 
    <editor> 
     <first-name>Britney</first-name> 
     <last-name>Bob</last-name> 
    </editor> 
    <price>55</price> 
    </book> 
    <magazine style="glossy" frequency="monthly"> 
    <price>2.50</price> 
    <subscription price="24" per="year"/> 
    </magazine> 
    <book style="novel" id="myfave"> 
    <author> 
     <first-name>Toni</first-name> 
     <last-name>Bob</last-name> 
     <degree from="Trenton U">B.A.</degree> 
     <degree from="Harvard">Ph.D.</degree> 
     <award>P</award> 
     <publication>Still in Trenton</publication> 
     <publication>Trenton Forever</publication> 
    </author> 
    <price intl="Canada" exchange="0.7">6.50</price> 
    <excerpt> 
     <p>It was a dark and stormy night.</p> 
     <p>But then all nights in Trenton seem dark and 
     stormy to someone who has gone through what 
     <emph>I</emph> have.</p> 
     <definition-list> 
     <term>Trenton</term> 
     <definition>misery</definition> 
     </definition-list> 
    </excerpt> 
    </book> 
    <my:book xmlns:my="uri:mynamespace" style="leather" price="29.50"> 
    <my:title>Who's Who in Trenton</my:title> 
    <my:author>Robert Bob</my:author> 
    </my:book> 
</bookstore> 

Odpowiedz

8

Dostałem odpowiedź.

//book[@style='novel' and ./author/award/text()='Pulitzer']//first-name 
+0

Jest to całkowicie w porządku, nie ma nic, aby poprawić. –

+1

Nie użyłbym 'text()', chyba że mam do czynienia z mieszaną zawartością (np. Element XHTML 'p' zawierający'

Lis przeskoczył nad leniwym psem

') i ja wyraźnie muszę wybrać tekst dziecko lub potomek (np. '/ p/text() [1]', aby wybrać węzeł tekstowy z '' '). W przeciwnym razie po prostu porównałbym ten element. Więc w twoim przypadku '// książka [@style = 'powieść' i autor/nagroda = 'Pulitzer'] // imię wystarcza, nie zyskujesz nic używając' author/award/text() '. –

+0

Dziękuję Jensowi i Martinowi za podzielenie się swoimi poglądami. – Akshay

5

Zastosowanie:

/*/book[@style='novel']/author[award = 'Pulitzer']/first-name 

to wybranie dowolnego first-name element, którego author rodzic ma award dziecku wartość ciągu 'Pulitzer' a, którego (z author) rodzica jest book którego style atrybut ma wartość "powieść", a jej rodzic jest najwyższym elementem dokumentu XML.

1

Podobne pytanie w tym samym kontekście. Jak mogę zrobić odwrotnie? Załóżmy, że chcę znaleźć id wszystkich książek, których cena jest większa niż 20? Wiem, że jestem szturchnięciem, ale naprawdę chcę wyjaśnić moje zrozumienie.

Oto potrzebne XPATH:

//book/price[text() > 20]/.. 
Powiązane problemy