2011-07-16 6 views
29

Mam dokumentu XML, że muszę się rozebrać na poszczególne kawałki danychzastosowanie XPath, aby wybrać elementy z zestawu wielu atrybutów/wartości

dokument XML ma strukturę w sposób następujący: -

<a> 
    <b select='yes please'> 
     <c d='text1' e='text11'/> 
     <c d='text2' e='text12'/> 
     <c d='text3' e='text13'/> 
     <c d='text4' e='text14'/> 
     <c d='text5' e='text15'/> 
    </b> 
</a> 
<a> 
    <b select='no thanks'> 
     <c d='text1' e='text21'/> 
     <c d='text3' e='text23'/> 
     <c d='text5' e='text25'/> 
    </b> 
</a> 
<a> 
    <b select='yes please'> 
     <c d='text1' e='text31'/> 
     <c d='text2' e='text32'/> 
     <c d='text3' e='text33'/> 
     <c d='text4' e='text34'/> 
     <c d='text5' e='text35'/> 
    </b> 
</a> 
<a> 
    <b select='no thanks'> 
     <c d='text4' e='text41'/> 
     <c d='text3' e='text43'/> 
     <c d='text5' e='text45'/> 
    </b> 
</a> 

Muszę wybrać tylko te grupy elementów/a/b, które mają atrybut d = "text1" i d atrybut = "tekst 4", gdy już zidentyfikuję te dokumenty pomocnicze Chcę uzyskać wartość e atrybutów za pomocą d wartość atrybutu "text5"

nadzieję, że ts wyraźne

Cheers

DD

+0

+1 dla XPath/XSLT niedziela pytanie :) –

+7

ops, jest sobota ... –

+0

@empo, w niektórych strefach jest niedziela już :-) –

Odpowiedz

32

tej można użyć XPath:

//a[b/c/@d = 'text1' and b/c/@d = 'text4']/b/c[@d = 'text5']/@e 

To będzie wybrać e='text15' i e='text35' z 1. i 3. a/b

XSLT:

<xsl:template match="//a[b/c/@d = 'text1' and b/c/@d = 'text4']/b/c[@d = 'text5']"> 
    <xsl:value-of select="@e"/> 
</xsl:template> 
+0

bardzo ładne, i dziękuję za poświęcony czas i wysiłek – Hector

+0

@ user423199, Nie ma za co! –

+0

@ user423199, Możesz oznaczyć jako odpowiedź lub przejąć właściwą odpowiedź. –

3

Można używać jednego szablonu, aby dopasować odpowiednią grupę, a następnie pojawi się wartość wymaganych atrybutów:

<xsl:template match="/*/a/b[c[@d='text1'] and c[@d='text4']]"> 
    <xsl:value-of select="c[@d='text5']/@e"/> 
</xsl:template> 

przyjmując:

<root> 
    <a> 
     <b select='yes please'> 
      <c d='text1' e='text11'/> 
      <c d='text2' e='text12'/> 
      <c d='text3' e='text13'/> 
      <c d='text4' e='text14'/> 
      <c d='text5' e='text15'/> 
     </b> 
    </a> 
    <a> 
     <b select='no thanks'> 
      <c d='text1' e='text21'/> 
      <c d='text3' e='text23'/> 
      <c d='text5' e='text25'/> 
     </b> 
    </a> 
    <a> 
     <b select='yes please'> 
      <c d='text1' e='text31'/> 
      <c d='text2' e='text32'/> 
      <c d='text3' e='text33'/> 
      <c d='text4' e='text34'/> 
      <c d='text5' e='text35'/> 
     </b> 
    </a> 
    <a> 
     <b select='no thanks'> 
      <c d='text4' e='text41'/> 
      <c d='text3' e='text43'/> 
      <c d='text5' e='text45'/> 
     </b> 
    </a> 
</root> 

wyjście będzie text15 i text35.

+0

dzięki za kłopot, aby spojrzeć na mój problem, doprowadzało mnie to do szału. Thankyou for spędzanie czasu na nim – Hector

+0

@user jesteś mile widziany. "Podchwytliwa" część tutaj jest dopasowaniem elementu, dla którego mamy co najmniej dwa wystąpienia tego samego dziecka z inną wartością atrybutu.Musisz użyć _and_, a dla jasności zagnieżdżonego predykatu –

3

muszę wybrać tylko te grupy elementów/A/B, które d atrybut = „text1” i d atrybut = „text4”, raz ja zidentyfikowali te podrzędne dokumenty chcę uzyskać wartość e atrybuty z d wartość atrybutu 'text5'

nadziei ów jasnych

Tak, to jest tak jasne, że tłumaczenie na język XPath jest niemal mechaniczny

(: those /a/b element groups :) a/b 
(: that have d attribute = 'text1' :) [c/@d='text1'] 
(: and d attribute = 'text4' :) [c/@d='text4'] 
(: and .. i want to get the value of the e attributes 
    with d attribute value 'text5' :)/c[@d='text5']/@e 
+1

FYI- Dla tych, którzy nie są zaznajomieni, '(::)' są komentarzami XPath 2.0. Http://www.w3.org/TR/xpath20/#prod-xpath-Comment Jeśli używasz XPath 1.0, usuń komentarze i po prostu użyj instrukcji XPath, czyli 'a/b [c/@ d = 'text1'] [c/@ d = 'text4']/c [@ d = 'text5']/@ e' –

1

pomocą tego jednego wyrażenia XPath:

/*/a/b[c/@d='text1' and c/@d='text4'] 
     /c[@d='text5'] 
      /@e