2009-01-26 26 views
12

Có cách nào để viết mẫu XSL 1.0 khớp với tất cả các chế độ không?Mẫu XSL có thể khớp với chế độ * ALL * không?

Hoặc tôi có phải viết một mẫu riêng biệt cho mọi chế độ hiện có (bao gồm các mẫu bổ sung cho các chế độ được thêm vào trong tương lai) không?

Dưới đây là những gì tôi có:

<xsl:apply-templates mode="mode1" /> 
    ... 
<xsl:apply-templates mode="mode2" /> 
    ... 
<!-- Do not process text content of nodes no matter in what mode --> 
<!-- Is there a way to have only one template here? --> 
<xsl:template match="text()" mode="mode1" /> 
<xsl:template match="text()" mode="mode2" /> 
+0

@divo Tôi sẽ không khuyên mọi người sử dụng #all trong XSLT 2.0 - quá nguy hiểm. Ví dụ: chỉ một mẫu chung chung hơn (nút khớp()) sẽ can thiệp vào * bất kỳ mẫu * khác nào.Tốt hơn hết là thiết kế mẫu của một người cẩn thận hơn, theo cách sạch hơn, để không cần phải #all. –

+0

@divo Bạn không cần mẫu trống khớp với văn bản() nếu bạn sử dụng thay vì sử dụng

+0

@Dimitre: Vâng, tất nhiên bạn đúng. Tuy nhiên, giải pháp của bạn ngụ ý việc sửa đổi mọi mẫu ứng dụng trong mã giúp bảo trì khá khó khăn và có vẻ dễ bị lỗi. –

Trả lời

7

Phương thức xác định trước: #all (chỉ có sẵn trong XSLT 2.0 tuy nhiên).

chỉnh sửa: sao chép chia sẻ chế độ hành vi với 1,0

<xsl:template match="/"> 
    <xsl:variable name="choice" select="'a'"/><!-- input seed here --> 
    <xsl:choose> 
     <xsl:when test="$choice='a'"> 
      <xsl:apply-templates mode="a"/> 
     </xsl:when> 
     <xsl:when test="$choice='b'"> 
      <xsl:apply-templates mode="b"/> 
     </xsl:when> 
    </xsl:choose> 
</xsl:template> 

<xsl:template match="*" mode="a"> 
    [A] 
    <xsl:apply-templates /> 
</xsl:template> 

<xsl:template match="*" mode="b"> 
    [B] 
    <xsl:apply-templates /> 
</xsl:template> 

<xsl:template match="text()"> 
    [ALL] 
</xsl:template> 
+0

Điều đó thật sự rất hay để có! Cảm ơn câu trả lời, nhưng có vẻ như chỉ XSLT 2.0 và tôi quên đề cập đến việc tôi bị hạn chế sử dụng XSLT 1.0 :-(Có vẻ như tôi sẽ phải viết một mẫu riêng ... –

+0

Ah, trong trường hợp đó bạn nên ít nhất có thể bọc mã phổ biến trong một mẫu có tên hoặc không có khuôn mẫu mà bạn có thể gọi từ trong hai chế độ dĩa – annakata

+0

@annakata Tôi không thấy mã XSLT 1.0 của bạn sẽ hoạt động như thế nào nếu có một mẫu được chọn trong tất cả các chế độ Có thể bạn, hãy chỉnh sửa câu trả lời của bạn và giải thích? –

1

Nếu bạn muốn có những template match trong tất cả các chế độ thì tại sao bạn đang sử dụng chế độ? Nếu bạn không sử dụng chế độ thì mẫu sẽ được sử dụng mọi lúc. Lý do cho chế độ là điều kiện làm những việc khác nhau với cùng một kiểu dữ liệu. Có vẻ như bạn muốn vô dụng.

+1

không hoàn toàn, nếu bạn đã ở trong chế độ dĩa (cho một số mục đích hữu ích) mẫu chế độ mặc định sẽ không được tham chiếu – annakata

+0

Không, tôi cần một số chế độ để xử lý các nút lần làm những việc khác nhau. Tuy nhiên, tôi không muốn xử lý nội dung của các nút nhất định trong bất kỳ chế độ nào. Giải pháp duy nhất dường như viết một mẫu riêng biệt cho mỗi chế độ. –

+0

(tiếp theo) Và một mẫu đơn giản sẽ chỉ khớp với một "cuộc gọi" áp dụng không mod. –

2

Có cách nào để viết một mẫu XSL 1.0 được phù hợp trong tất cả các chế độ

Vâng, để làm được điều này nên làm theo hai quy tắc này:

  1. Viết mẫu của bạn mà không có thuộc tính chế độ.

  2. Trong mẫu moded có một <xsl:apply-templates> hướng dẫn mà không có một chế độ thuộc tính rằng sẽ dẫn đến việc mẫu trong mục 1 ở trên được chọn để chế biến

này sau trực tiếp từ XSLT 1.0 spec, which says:

Nếu yếu tố xsl:apply-templates có một Thuộc tính mode, sau đó nó chỉ áp dụng cho các quy tắc mẫu đó từ các nguyên tố xsl:template có thuộc tính mode có cùng giá trị; nếu một yếu tố xsl:apply-templates không có một thuộc tính mode, sau đó nó được áp dụng chỉ cho những quy tắc mẫu từ xsl:template yếu tố mà không có một thuộc tính mode.

Để tóm tắt: Một tập hợp các mẫu từng trong một chế độ khác nhau vẫn có thể phát hành <xsl:apply-templates> theo cách như vậy (mô tả ở trên), do đó cùng cụ thể, mẫu đơn sẽ được lựa chọn để chế biến trong từng trường hợp.

+0

Điều này có thể làm việc trong ví dụ đơn giản được trình bày ở đây. Tuy nhiên, điều này có thể có tác dụng phụ khi có nhiều hơn một mẫu không mod. Hành vi exacet của chế độ #all của XSLT 2.0 không có sẵn trong XSLT 1.0 và khó có thể mô phỏng được. –

+0

@divo Tôi sẽ không khuyên bất kỳ ai sử dụng #all trong XSLT 2.0 - nó quá nguy hiểm. Ví dụ: chỉ một mẫu chung chung hơn (nút khớp()) sẽ can thiệp vào * bất kỳ mẫu * khác nào. Tốt hơn hết là thiết kế mẫu của một người cẩn thận hơn, theo cách sạch hơn, để không cần phải #all. –

+0

Có, nó nên được sử dụng cẩn thận, nhưng nó phụ thuộc rất nhiều vào kịch bản. Trong trường hợp của tôi, nội dung của các phần tử rời sẽ * không bao giờ * xuất hiện trong đầu ra, do đó các mẫu trống phù hợp với văn bản(). Tôi không thấy vấn đề với một khuôn mẫu chung chung hơn, vì "cụ thể hơn" có ưu tiên cao hơn. –

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