2011-07-06 4 views
5

Yayın atıflarını arayan küçük bir uygulamam var. Alıntılar XML'de bulunur ve parametre veya enstrüman gibi alanları aramak için XSLT'ye PHP üzerinden parametre aktarırım. yapı aşağıdaki gibidir:XPath: Birden çok çocuktan birini eşleştirin

<publications> 
    <paper> 
     <authors> 
      <author>James Smith</author> 
      <author>Jane Doe</author> 
     </authors> 
     <year>2010</year> 
     <title>Paper 1</title> 
     (more children) 
    </paper> 
    (more papers) 
</publications> 

Ben XSLT'de benim şablon diyoruz, ben kağıtları arama kriterlerine göre gösterilmesi gereken kısaltmanın bir yüklemi. parametre $ yazar ayarlanırsa Yani, örneğin, yapmak:

<xsl:apply-templates select="paper[contains(authors/author, $author)]" /> 

sorun: Bu "yazarlar" in ilk yazar için çalışır, ancak bundan sonra olanları göz ardı eder. Yukarıdaki örnekte, "Smith" kelimesinin aranması bu makaleyi döndürür, ancak "Doe" hiçbir şey döndürmez.

İfadelerimi tüm "yazar" öğelerini hesaba katmak için nasıl biçimlendirebilirim?

cevap

5

contains işlevi, bir dizeyi ilk bağımsız değişken olarak değil, bir düğüm kümesi olarak bekler. İfadenizle ilk sonuç authors/author bir dizeye dönüştürülür ve sonra işleve iletilir. Bunun yerine

bağımsız author düğümlerin her test eden bir yüklemi:

<xsl:apply-templates select="paper[authors/author[contains(., $author)]]" /> 
bakınız, örneğin, Saxon davranışının bu açıklamayı

:

+0

teşekkür ederiz ! Rüya gibi çalıştı. – tkm256