2010-06-27 38 views
46

Tôi chỉ đang học XML và cách sử dụng các tệp XSL. Trong tệp XSL, tôi tìm thấy cụm từ sau:XSL xsl: template match = "/"

xsl:template match="/" 

Điều này phù hợp với điều gì? Và tôi có thể sử dụng cái gì thay vì /? Tôi có thể viết table hoặc bất kỳ thẻ HTML nào khác thay vì / không?

Trả lời

7

Thuộc tính đối sánh cho biết các phần mà chuyển đổi mẫu sẽ được áp dụng. Trong trường hợp cụ thể, "/" có nghĩa là thư mục gốc của tài liệu xml. Giá trị bạn phải cung cấp vào thuộc tính đối sánh phải là biểu thức XPath. XPath là ngôn ngữ bạn phải sử dụng để tham chiếu các phần cụ thể của tệp xml đích.

Để hiểu rõ hơn về những gì khác bạn có thể đưa vào thuộc tính đối sánh, bạn cần hiểu xpath là gì và cách sử dụng nó. Tôi đề nghị bạn nên xem các liên kết mà tôi đã cung cấp cho bạn ở cuối câu trả lời.

Tôi có thể viết "bảng" hoặc bất kỳ thẻ nào khác html thay vì "/" không?

Có thể. Nhưng điều này phụ thuộc chính xác những gì bạn đang cố gắng làm. nếu tệp xml mục tiêu của bạn có chứa các phần tử HMTL và bạn đang triyng áp dụng mẫu xsl: này trên chúng, bạn nên sử dụng bảng, div hoặc anithing khác.

Dưới đây là một số liên kết:

+2

Câu trả lời này không thực sự chính xác. Không phải mọi biểu thức XPath đều có thể được chỉ định làm mẫu đối sánh pháp lý. –

+1

Tôi đồng ý nhưng theo ý kiến ​​của tôi thì tốt hơn cho người mới bắt đầu xem xét mẫu phù hợp khi được xác định bằng XPath. – Koynov

108

Giá trị của match thuộc tính của lệnh <xsl:template> phải là một mẫu phù hợp.

Mẫu kết hợp tạo thành một tập con của tập hợp tất cả các biểu thức XPath có thể là. Giới hạn đầu tiên, tự nhiên là mẫu phù hợp phải chọn một tập hợp các nút. Ngoài ra còn có những hạn chế khác. Đặc biệt, các trục ngược không được phép trong các bước vị trí (nhưng có thể được xác định trong các vị từ). Ngoài ra, không cho phép tham chiếu biến hoặc tham số trong XSLT 1.0, nhưng việc sử dụng chúng là hợp pháp trong XSLT 2.x.

/ trong XPath biểu thị gốc hoặc nút tài liệu. Trong XPath 2.0 (và do đó XSLT 2.x), điều này cũng có thể được viết là document-node().

Mẫu đối sánh có thể chứa // abbreviation.

Ví dụ về mô hình phù hợp:

<xsl:template match="table"> 

có thể được áp dụng trên bất kỳ yếu tố tên table.

<xsl:template match="x/y"> 

thể được áp dụng trên bất kỳ phần tên y mà cha mẹ là một yếu tố được đặt tên x.

<xsl:template match="*"> 

có thể được áp dụng cho bất kỳ thành phần nào.

<xsl:template match="/*"> 

chỉ có thể được áp dụng cho phần tử trên cùng của tài liệu XML.

<xsl:template match="@*"> 

có thể được áp dụng cho bất kỳ thuộc tính nào.

<xsl:template match="text()"> 

có thể được áp dụng cho bất kỳ nút văn bản nào.

<xsl:template match="comment()"> 

có thể được áp dụng cho bất kỳ nút nhận xét nào.

<xsl:template match="processing-instruction()"> 

có thể được áp dụng cho bất kỳ nút lệnh xử lý nào.

<xsl:template match="node()"> 

có thể được áp dụng cho bất kỳ nút nào: yếu tố, văn bản, nhận xét hoặc hướng dẫn xử lý.

+0

Điều đó hữu ích khi biết và hiếm khi được đề cập trong các nguồn khác: "Nút khớp với mẫu nếu nút là thành viên của kết quả đánh giá mẫu dưới dạng biểu thức liên quan đến một số ngữ cảnh có thể xảy ra; nút là nút được khớp hoặc một trong các tổ tiên của nó. " (https://www.w3.org/TR/xslt#patterns) –

+0

@NiklasPeter, Vâng, ở đây Spec giải thích một chút về cách các biểu thức XPath được đánh giá - vì vậy chúng ta cần đề cập đến bất kỳ lập trình viên XSLT nào được mong đợi biết XPath? Tôi nghĩ rằng tất cả mọi người là khá ý thức về điều kiện tiên quyết này. –

+0

Lý do tôi thêm trích dẫn này là phần cuối cùng của nó: "các bối cảnh có thể là những ngữ cảnh có nút ngữ cảnh là nút được kết hợp hoặc một trong các tổ tiên của nó".Tôi nghĩ rằng cố gắng tất cả các nút tổ tiên là đặc trưng cho XSLT và không phải là một thực tế, mà không phải tất cả mọi người thoải mái với XPath biết. –

34

Điều đáng chú ý, vì nó gây nhầm lẫn cho những người mới sử dụng XML, rằng gốc (hoặc nút tài liệu) của một tài liệu XML không phải là phần tử cấp cao nhất. Đó là phụ huynh của phần tử cấp cao nhất. Điều này gây nhầm lẫn vì dường như yếu tố cấp cao nhất có thể có một phụ huynh. Đó không phải là cấp cao nhất sao?

Nhưng xem xét điều này, một tài liệu XML cũng như hình thành:

<?xml-stylesheet href="my_transform.xsl" type="text/xsl"?> 
<!-- Comments and processing instructions are XML nodes too, remember. --> 
<TopLevelElement/> 

Gốc của tài liệu này có ba người con: một hướng dẫn chế biến, bình luận, và một phần tử.

Vì vậy, ví dụ, nếu bạn muốn viết một biến đổi đó đã thoát khỏi bình luận đó, nhưng còn lại trong bất kỳ ý kiến ​​xuất hiện bất cứ nơi nào khác trong tài liệu, bạn muốn thêm video này vào bản sắc transform:

<xsl:template match="/comment()"/> 

Thậm chí đơn giản hơn (và thường hữu ích hơn), đây là mẫu XPath khớp với phần tử cấp cao nhất của tài liệu bất kể tên của nó: /*.

+3

Tôi đã dành một đoạn tốt của sáng nay đang hoàn toàn bối rối bởi tài liệu này/nhị phân phần tử gốc. Tôi đã sử dụng XML và DOM trong nhiều năm, nhưng vẫn đi lên trên những thứ như thế này! –

+1

Cảm ơn bạn đã cho phép tôi ở trên sự phân biệt tinh tế nhưng tiểu học này mà tôi đã quên lãng quá lâu! :) – Chris

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