2016-03-30 41 views
2

Ben de sistemde çalışanların bir XML belgesi vardır:Satır sonları ( n) XPath içinde concat() aracılığıyla?

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<couriersystem title="System" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="schema.xsd"> 
    <!-- snip --> 
    <employees> 
     <employee eid="1"> 
      <nin>AZ123518D</nin> 
      <firstname>Peter</firstname> 
      <lastname>Smith</lastname> 
      <gender>Male</gender> 
      <dob>1994-02-11</dob> 
      <email>[email protected]</email> 
      <address> 
       119, London Street, Nidrie, F57 8NE 
      </address> 
      <tel>07005748900</tel> 
      <salary>30526</salary> 
      <empbranch bid="1" /> 
      <supervisor sid="1" /> 
     </employee> 
     <employee eid="2"> 
      <nin>CN174869F</nin> 
      <firstname>Jennifer</firstname> 
      <lastname>Black</lastname> 
      <gender>Male</gender> 
      <dob>1984-12-24</dob> 
      <email>[email protected]</email> 
      <address> 
       161, South Road, Nidrie, W79 8WG 
      </address> 
      <tel>07555111222</tel> 
      <salary>40576</salary> 
      <empbranch bid="2" /> 
      <supervisor sid="1" /> 
     </employee> 
     <employee eid="3"> 
      <nin>ET127654M</nin> 
      <firstname>Aaron</firstname> 
      <lastname>Jones</lastname> 
      <gender>Male</gender> 
      <dob>1968-03-15</dob> 
      <email>[email protected]</email> 
      <address> 
       66, High Road, Yoker, Q47 4SR 
      </address> 
      <tel>07856471267</tel> 
      <salary>30526</salary> 
      <empbranch bid="3" /> 
      <supervisor sid="1" /> 
     </employee> 
     <employee eid="4"> 
      <nin>GC765238A</nin> 
      <firstname>Alistair</firstname> 
      <lastname>Smith</lastname> 
      <gender>Male</gender> 
      <dob>1976-11-26</dob> 
      <email>[email protected]</email> 
      <address> 
       109, West Plaza, Clydebank, G55 8RC 
      </address> 
      <tel>0700</tel> 
      <salary>25400</salary> 
      <empbranch bid="4" /> 
      <supervisor sid="1" /> 
     </employee> 
     <employee eid="5"> 
      <nin>HP146854D</nin> 
      <firstname>Emma</firstname> 
      <lastname>Reynolds</lastname> 
      <gender>Male</gender> 
      <dob>1995-05-05</dob> 
      <email>[email protected]</email> 
      <address> 
       57, Scott Street, Aberdeen, O75 2KS 
      </address> 
      <tel>07625361536</tel> 
      <salary>25400</salary> 
      <empbranch bid="5" /> 
      <supervisor sid="7" /> 
     </employee> 
     <!-- snip --> 
    </employees> 
    <!-- snip --> 
</couriersystem> 

Ve ben onların amiri tarafından çalışan tüm ayrıntıları almak için XPath vardır:

//employee[supervisor/@sid='1']/concat('Name: ', concat(firstname/text(), ' ', lastname/text(), '\nGender: ', gender/text(), '\nD.O.B: ', dob/text())) 

Ama sadece gösterileri Bunların geri kalanından bir çalışan ve \n karakter de gösterir.

Bu sorunu nasıl düzeltebilirim? @madcrazydrumma]:

cevap

3

almak için \n XPath'de concat() yorumlanır edilecek codepoints-to-string(10) [kredisi kullanmak aşağıdaki gibi sonra sonuçları dönecektir

//employee[supervisor/@sid='1']/concat('Name: ', firstname, ' ', lastname, 
             codepoints-to-string(10), 
             'Gender: ', gender, 
             codepoints-to-string(10), 
             'D.O.B: ', dob) 

:

Name: Peter Smith 
Gender: Male 
D.O.B: 1994-02-11 
Name: Jennifer Black 
Gender: Male 
D.O.B: 1984-12-24 
Name: Aaron Jones 
Gender: Male 
D.O.B: 1968-03-15 
Name: Alistair Smith 
Gender: Male 
D.O.B: 1976-11-26 

Minör not: Temel XPath 2.0 ifadenizin iyi olduğu ortaya çıktı. Açıklamalarda keşfettiğimiz gibi, sitenin xpathtester.com/xpath sınırlamaları nedeniyle sonuçlar yanlıştı. Çevrimiçi XPath 2.0 testi için videlibri.sourceforge.net/cgi-bin/xidelcgi kullanın.

+0

Sadece geri dönen bir sonuç olsa da, bu en garip şey! – madcrazydrumma

+0

Hangi XPath 2.0 kütüphanesini kullanıyorsunuz? – kjhughes

+0

Bunu test etmek için kullanıyorum: http://www.xpathtester.com/xpath – madcrazydrumma

2

Eh, XSLT'de ile XPath ifadesini test edilmiş ve çıkış 4 girdilerini istediğiniz gibi içerir:

Benim XSLT oldu:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/couriersystem"> 
    <xsl:copy-of select="//employee[supervisor/@sid='1']/concat('Name: ', concat(firstname/text(), ' ', lastname/text(), '\nGender: ', gender/text(), '\nD.O.B: ', dob/text()))" /> 
    </xsl:template> 
</xsl:stylesheet> 

sonuç tüm metin bir satırda geçerli: Eğer biraz daha yukarıda daha biçimlendirilmiş çıkışı istiyorsanız

<?xml version="1.0" encoding="UTF-8"?>Name: Peter Smith\nGender: Male\nD.O.B: 1994-02-11 Name: Jennifer Black\nGender: Male\nD.O.B: 1984-12-24 Name: Aaron Jones\nGender: Male\nD.O.B: 1968-03-15 Name: Alistair Smith\nGender: Male\nD.O.B: 1976-11-26 

,ekler bu ifadeleri deneyin uygun yerlerdekarakterler:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/couriersystem"> 
    <xsl:value-of select="'&#10;'" /> 
    <xsl:for-each select="//employee[supervisor/@sid='1']"> 
     <xsl:value-of select="concat('Name: ', firstname/text(), ' ', lastname/text(), '&#10;','Gender: ', gender/text(), '&#10;','D.O.B: ', dob/text(),'&#10;')" /> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

bu sonucudur:

<?xml version="1.0" encoding="UTF-8"?> 
Name: Peter Smith 
Gender: Male 
D.O.B: 1994-02-11 
Name: Jennifer Black 
Gender: Male 
D.O.B: 1984-12-24 
Name: Aaron Jones 
Gender: Male 
D.O.B: 1968-03-15 
Name: Alistair Smith 
Gender: Male 
D.O.B: 1976-11-26 

P.S. .: 'Jennifer Siyah' transseksüel mi? Çünkü o bir kadın adı ve bir erkek cinsiyet var ;-)

+0

Haha arkadaşım verileri bu şekilde girebilir! ;) ve bunun için XSL kullanmıyorum, bu yüzden maalesef sorunu çözmüyor bu yüzden – madcrazydrumma

+1

Son sözüm sadece küçük bir şakaydı * g *. Ancak, XPath ifadem temel olarak kabul edilen yanıtla aynıdır, sadece ' ' kodunu 'codepoints-to-string (10) 'ile değiştirin ve ifadeleri birleştirin ve bitti. – zx485