2009-10-07 40 views
6

Xem xét XML này:Khi cùng một phần tử XML khớp với hai mẫu XSLT thông qua các XPath khác nhau, mẫu nào thực hiện và tại sao?

<people> 
    <person> 
    <firstName>Deane</firstName> 
    <lastName>Barker</lastName> 
    </person> 
</people> 

gì nếu hai XSLT mẫu nào khớp một yếu tố qua XPath khác nhau? Tôi biết rằng nếu phần tử "khớp" trên hai mẫu giống hệt nhau (điều này sẽ không bao giờ xảy ra, tôi không nghĩ), mẫu cuối cùng sẽ kích hoạt.

Tuy nhiên, hãy xem xét XSL này:

<xsl:template match="person/firstName"> 
    Template #1 
</xsl:template> 

<xsl:template match="firstName"> 
    Template #2 
</xsl:template> 

Yếu tố "firstName" sẽ phù hợp trên một trong những mẫu này - một trong những đầu tiên như một đứa trẻ của "người" và thứ hai độc lập.

Tôi đã thử nghiệm điều này và Mẫu # 1 thực hiện, trong khi Mẫu # 2 thì không. Nguyên tắc hoạt động đằng sau điều này là gì? Tôi có thể nghĩ đến ba điều:

  1. đặc hiệu của XPath (cao nghi ngờ)
  2. Vị trí trong tập tin XSLT (còn nghi ngờ)
  3. Một số pre-emption của Template # 2 bởi Template # 1. Một cái gì đó xảy ra trong quá trình thực thi Mẫu số 1 cho biết Mẫu # 2 không thực thi.

Trả lời

8

Điểm đầu tiên của bạn thực sự chính xác, có một thứ tự xác định được mô tả trong http://www.w3.org/TR/xslt#conflict. Theo thông số kỹ thuật, person/firstName có mức độ ưu tiên là 0 trong khi firstName có mức độ ưu tiên là -0,5. Bạn cũng có thể chỉ định mức độ ưu tiên cho mình bằng cách sử dụng thuộc tính priority trên xsl:template.

+4

Deane cũng là có liên quan: nếu hai mẫu phù hợp với các cùng một đặc trưng, ​​đó là nghiêm chỉnh nói một lỗi, nhưng hầu hết các bộ vi xử lý không báo cáo lỗi và thay vào đó có tùy chọn cho phép áp dụng mẫu xuất hiện cuối cùng trong biểu định kiểu. – NickFitz

+0

Vì vậy, điều này có nghĩa là một phần tử sẽ chỉ có một mẫu được thực hiện cho nó? Sự hiểu biết của tôi là bộ xử lý đi qua XML và cho mỗi phần tử hỏi, "Tôi sẽ thực thi mẫu nào?" Có đúng là nó sẽ chỉ bao giờ thực thi một mẫu đơn cho mỗi phần tử trong XML? – Deane

+1

Chỉnh sửa: người/firstName có mức độ ưu tiên là 0,5 và firstName có mức ưu tiên là 0. Một mẫu có mức ưu tiên mặc định cao nhất (0.5) nếu và chỉ khi có một hoặc nhiều dấu gạch chéo ('/') hoặc dấu ngoặc vuông (' [','] ') –

3

Tôi biết rằng nếu các yếu tố "trận đấu" trên hai mẫu là giống hệt nhau (mà không bao giờ nên xảy ra, tôi không nghĩ rằng)

Điều này có thể xảy ra nhưng sẽ không có nhiều điểm làm điều này và có hai mẫu phù hợp.

Từ spec:

Đây là một lỗi nếu điều này để lại nhiều hơn một mẫu nguyên tắc phù hợp. An Bộ xử lý XSLT có thể báo hiệu lỗi; nếu nó không báo hiệu lỗi, nó phải khôi phục bằng cách chọn, từ trong số quy tắc mẫu phù hợp là bên trái, kết quả xảy ra cuối cùng trong biểu định kiểu .

Vì vậy, nói cách khác bạn có thể gặp lỗi hoặc nó sẽ chỉ sử dụng mẫu cuối cùng trong XSLT của bạn tùy thuộc vào cách xử lý bạn đang sử dụng đã được viết để xử lý tình huống này.

0

Hãy xem xét điều này với ngữ cảnh trong tâm trí. Cái đầu tiên khớp, và thay đổi ngữ cảnh n (do đó thứ hai không khớp). Ngữ cảnh được đặt thành SAU KHI người đầu tiên được chọn và xử lý để phần tử hiển thị từ ngữ cảnh đó không còn chứa "firstname". NẾU bạn muốn cả hai để thực hiện, sau đó bạn có thể gọi cho họ để thay đổi bối cảnh trở lại đầu trang.

<xsl:template match="people"> 
    <xsl:apply-templates select="person/firstname"/> 
    <xsl:apply-templates select="firstname"/> 
</xsl:template> 
+0

Điều này là không đúng sự thật. Bộ xử lý XSLT quyết định mẫu nào sẽ chạy bằng cách nhìn vào nút mà nó đang xử lý và chọn mẫu cụ thể nhất bằng cách đánh giá biểu thức đối sánh và vị trí mẫu và mức độ ưu tiên vốn có của nó. Cách bạn gọi mẫu không tạo ra sự khác biệt nào cả - biểu thức 'select' của' 'và mẫu' match' của '' không có kết nối với nhau. – Tomalak

2

Lưu ý rằng giá trị của thuộc tính matchkhông một biểu thức XPath (mặc dù nó sử dụng một tập hợp con của cú pháp XPath). Đó là mẫu XSLT . Vắng mặt rõ ràng priority thuộc tính, sự lựa chọn đi xuống đến đó mô hình có ưu tiên mặc định cao nhất:

person/firstName có một ưu tiên mặc định của .5

firstName có một ưu tiên mặc định của

Vì vậy , person/firstName thắng.

Một lời giải thích đầy đủ về cách thức hoạt động giải quyết xung đột có thể được tìm thấy ở đây (mặc dù tôi khuyên bạn nên nghiên cứu toàn bộ chương, "Làm thế nào XSLT trình"): Điểm thứ hai Conflict Resolution for Template Rules

Các vấn đề liên quan