2009-07-16 34 views
5

Có thể khớp các thuộc tính mà không thuộc về một tập hợp con các thuộc tính không? Ví dụ: tôi muốn kết hợp mọi thứ nhưng @ attr1 và @ attr2. Có cách nào để viết một tuyên bố phù hợp với mẫu tương tự như sau, hay tôi đang đi về điều này một cách sai lầm?XSLT không khớp với các thuộc tính nhất định

<xsl:template match="NOT(@attr1) and NOT(@attr2)">  

Cảm ơn

Trả lời

7

Cách đơn giản nhất là nên sử dụng hai mẫu:

<xsl:template match="@attr1|@attr2"/> 
<xsl:template match="@*"> 
    .... 
</xsl:template> 

Mẫu đầu tiên sẽ bắt tài liệu tham khảo cho những người bạn muốn bỏ qua, và chỉ đơn giản là ăn họ. Thứ hai sẽ khớp với các thuộc tính còn lại.

+0

Điều này hiệu quả. Cảm ơn bạn. – Steve

+0

Làm thế nào về nếu tại một số điểm khác trong kịch bản tôi muốn xử lý các thuộc tính đã được loại trừ. Bạn có biết nếu điều đó vẫn còn có thể? Về cơ bản tôi có hàng trăm thuộc tính mà tôi cần phải khớp, tất cả đều yêu cầu cùng một hành động, và chỉ một tập con rất nhỏ yêu cầu xử lý đặc biệt. Vì vậy, tôi muốn loại trừ những người cần xử lý đặc biệt, cho đến khi tôi quyết định xử lý chúng. Về cơ bản tôi chỉ cần in ra các tên thuộc tính và giá trị được gán. – Steve

+1

Tôi thực sự đã giải quyết vấn đề bằng cách sử dụng các chế độ kết hợp với giải pháp của bạn ở trên. .... ... Steve

2

Yêu cầu op là gì có thể. Sử dụng các mục sau:

<xsl:template match="@*[local-name()!='attr1' and local-name()!='attr2']"> 
    .... 
</xsl:template> 

Điều này đặc biệt hữu ích nếu bạn muốn thay đổi thuộc tính hoặc thêm thuộc tính nếu thiếu thao tác một bản sao. Câu trả lời khác không hoạt động trong tình huống như vậy. ví dụ.

... 
    <xsl:copy> 
    <xsl:attribute name="attr1"> 
     <xsl:value-of select="'foo'"/> 
    </xsl:attribute> 
    <xsl:apply-templates select="@*[local-name()!='attr1']|node()"/> 
    </xsl:copy> 
    ... 
Các vấn đề liên quan