2012-06-30 19 views
7

Cách lấy vị trí của nút cha trong tài liệu hoàn chỉnh bằng cách sử dụng xpath?Tìm vị trí của nút cha bằng cách sử dụng xpath

nói rằng tôi có xml sau:

<catalog> 
    <cd> 
    <title>Empire Burlesque</title> 
    <artist>Bob Dylan</artist> 
    <country>USA</country> 
    <company>Columbia</company> 
    <price>10.90</price> 
    <year>1985</year> 
    </cd> 
    <cd> 
    <title>Hide your heart</title> 
    <artist>Bonnie Tyler</artist> 
    <country>UK</country> 
    <company>CBS Records</company> 
    <price>9.90</price> 
    <year>1988</year> 
    </cd> 
</catalog> 

và tôi có một XSLT để chuyển đổi nó sang HTML, đó là như sau (chỉ đoạn mã):

<xsl:template match="/"> 
<html> 
    <body> 
    <xsl:apply-templates/> 
    </body> 
    </html> 
</xsl:template> 

<xsl:template match="cd"> 
    <p> 
    <xsl:number format="1. "/><br/> 
    <xsl:apply-templates select="title"/> 
    <xsl:apply-templates select="artist"/> 
    </p> 
</xsl:template> 

<xsl:template match="title"> 
    <xsl:number format="1" select="????" /><br/> 
    Title: <span style="color:#ff0000"> 
    <xsl:value-of select="."/></span> 
    <br /> 
</xsl:template> 

tôi nên viết gì vào nơi ???? để có được vị trí của thẻ cd cha trong tài liệu. Tôi đã thử nhiều cách diễn đạt nhưng dường như không có gì hiệu quả. Có thể tôi đang làm điều đó hoàn toàn sai.

  1. <xsl:number format="1" select="catalog/cd/preceding-sibling::..[position()]" />
  2. <xsl:number format="1" select="./parent::..[position()]" /><br/>
  3. <xsl:value-of select="count(cd/preceding-sibling::*)+1" /><br/>

Tôi giải thích thứ 2 là trục mẹ chọn hiện tại nút và sau đó nói với các vị trí của công ty mẹ của nút hiện hành. Tại sao nó không làm việc? Cách chính xác để làm điều này là gì.

FYI: Tôi hy vọng mã sẽ in vị trí của thẻ cd gốc của thẻ tiêu đề hiện tại xử lý uder.

Xin vui lòng ai đó có thể cho tôi biết cách thực hiện việc này.

Trả lời

16
count(../preceding-sibling::cd) + 1 

Bạn có thể run it here (lưu ý tôi đã xóa số khác bạn đã xuất, chỉ để rõ ràng).

Bạn đã đi đúng hướng, nhưng hãy nhớ rằng các vị từ chỉ được sử dụng để lọc các nút chứ không phải để trả về thông tin. Vì vậy:

../*[position()] 

... có hiệu quả nói "tìm cho tôi cha mẹ có vị trí". Nó trả về nút, chứ không phải chính vị trí đó. Vị từ chỉ là một bộ lọc.

Trong mọi trường hợp đều có những cạm bẫy khi sử dụng position() và có thể được sử dụng để trả lại vị trí của nút ngữ cảnh hiện tại chỉ - không phải nút khác.

+0

Cảm ơn một người đàn ông tấn, bây giờ nó là ngớ ngẩn của tôi không phải cố gắng đó. Cảm ơn lần nữa :) – Harshdeep

+0

Chỉ một điều nữa bạn có thể giải thích cụm từ "count (../ preceding-sibling :: cd) + 1" như bạn đã làm cho "position()". Tôi đã sử dụng giải pháp của bạn và nó hoạt động tốt nhưng tôi không thể hiểu tại sao không "đếm (cd/preceding-sibling :: ..) + 1" – Harshdeep

+2

Hãy nhớ rằng các mẫu XSLT hoạt động từ phối cảnh của nút ngữ cảnh hiện tại. Trong khuôn mẫu có liên quan, nút ngữ cảnh là tiêu đề. Do đó, 'count (cd ...)' sẽ không tìm thấy bất kỳ nút nào vì không có nút con nào của 'title' được gọi là' cd' (thực sự, 'title' không có nút con của bất kỳ tên nào). 'cd' là cha của' title', không phải là con của nó, do đó chúng ta phải tăng cấp độ. – Utkanos

1
<xsl:number format="1" select="????" /> 

tôi nên viết gì tại nơi ???? để có được vị trí của thẻ cha cd trong tài liệu.

Trước hết, các hướng dẫn XSLT trên là cú pháp bất hợp pháp - hướng dẫn <xsl:number> không (có thể không) có một select thuộc tính.

Sử dụng: Câu trả lời

<xsl:number format="1" count="cd" /> 
+0

Vì vậy, nó có thể được thực hiện bằng cách sử dụng xsl: number là tốt. Cảm ơn bạn về thông tin. bạn có thể cung cấp thêm một số thông tin về cách thức hoạt động của nó không. – Harshdeep

+0

@Harshdeep: Bạn có thể tìm hiểu tốt nhất "cách này hoạt động" bằng cách nhấp vào liên kết (vâng, màu xanh của '' trong câu trả lời có nghĩa là đây là liên kết có thể nhấp). Để xem kết quả của việc sử dụng hướng dẫn này, hãy sao chép và dán nó vào mã của bạn. –

+0

Tôi đã nhấp vào liên kết trước khi hỏi bạn nhưng tài liệu w3 quá cồng kềnh đến nỗi tôi không thấy nó rất dễ đọc. Nhưng sẽ xem xét nó ngay bây giờ để hiểu rõ hơn. – Harshdeep

3

của Utkanos hoạt động tốt nhưng kinh nghiệm của tôi là, khi tài liệu xml là lớn, điều này có thể dẫn đến vấn đề hiệu suất.

Trong trường hợp này, bạn chỉ cần chuyển vị trí của phụ huynh trong thông số.

<xsl:template match="/"> 
<html> 
    <body> 
    <xsl:apply-templates/> 
    </body> 
    </html> 
</xsl:template> 

<xsl:template match="cd"> 
    <p> 
    <xsl:number format="1. "/><br/> 
    <xsl:apply-templates select="title"> 
     <xsl:with-param name="parent_position" select="position()"/> <!-- Send here --> 
    </xsl:apply-templates> 
    <xsl:apply-templates select="artist"/> 
    </p> 
</xsl:template> 

<xsl:template match="title"> 
    <xsl:param name="parent_position"/> <!-- Receive here --> 
    <xsl:number format="1" select="$parent_position"/><br/> 
    Title: <span style="color:#ff0000"> 
    <xsl:value-of select="."/></span> 
    <br /> 
</xsl:template> 

kết quả:

<html xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><body> 
    <p>1. <br>1<br> 
    Title: <span style="color:#ff0000">Empire Burlesque</span><br>Bob Dylan</p> 
    <p>2. <br>1<br> 
    Title: <span style="color:#ff0000">Hide your heart</span><br>Bonnie Tyler</p> 
</body></html>