Tôi biết câu hỏi này đã cũ, nhưng giữa tất cả các câu trả lời, tôi bỏ lỡ một câu hỏi là cách tiếp cận phổ biến cho trường hợp sử dụng này trong phát triển XSLT.
Tôi đang tưởng tượng rằng mã bị thiếu từ OP trông giống như thế này:
<xsl:template match="category">
<xsl:choose>
<xsl:when test="categoryName !=null">
<xsl:value-of select="categoryName " />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="other" />
</xsl:otherwise>
</xsl:choose>
</category>
Và rằng đầu vào trông giống như thế này:
<categories>
<category>
<categoryName>Books</categoryName>
</category>
<category>
<categoryName>Magazines</categoryName>
<categoryName>Periodicals</categoryName>
<categoryName>Journals</categoryName>
</category>
<category>
<categoryName><!-- please fill in category --></categoryName>
</category>
<category>
<categoryName />
</category>
<category />
</categories>
Tức là, tôi cho rằng có thể có 0, trống, đơn hoặc nhiều categoryName
phần tử. Để giải quyết tất cả các trường hợp này bằng xsl:choose
cách sử dụng các cấu trúc kiểu, hay nói cách khác, bắt buộc phải nhanh chóng trở nên lộn xộn (thậm chí nhiều hơn nếu các yếu tố có thể ở các cấp độ khác nhau!). Một thành ngữ lập trình điển hình trong XSLT là sử dụng các mẫu (do đó T trong XSLT), đó là lập trình khai báo, không bắt buộc (bạn không nói cho bộ xử lý biết phải làm gì, bạn chỉ cần nói bạn muốn đầu ra nếu điều kiện nhất định được đáp ứng). Đối với trường hợp sử dụng này, có thể trông giống như sau:
<!-- positive test, any category with a valid categoryName -->
<xsl:template match="category[categoryName[text()]]">
<xsl:apply-templates />
</xsl:template>
<!-- any other category (without categoryName, "null", with comments etc) -->
<xsl:template match="category">
<xsl:text>Category: Other</xsl:text>
</xsl:template>
<!-- matching the categoryName itself for easy handling of multiple names -->
<xsl:template match="categoryName">
<xsl:text>Category: </xsl:text>
<xsl:value-of select="." />
</xsl:template>
Điều này hoạt động (với bất kỳ phiên bản XSLT nào), vì phiên bản đầu tiên ở trên có độ ưu tiên cao hơn (nó có một vị ngữ). Mẫu phù hợp "rơi qua", mẫu thứ hai, nắm bắt bất cứ điều gì không hợp lệ. Cái thứ ba sau đó đảm nhận việc xuất racategoryName
giá trị một cách thích hợp.
Lưu ý rằng trong kịch bản này, không cần phải khớp cụ thể categories
hoặc category
bởi vì bộ xử lý sẽ tự động xử lý tất cả trẻ em, trừ khi chúng tôi nói khác (trong ví dụ này, mẫu thứ hai và thứ ba không xử lý thêm cho trẻ em, vì không cóxsl:apply-templates
trong họ).
Cách tiếp cận này dễ dàng mở rộng hơn cách tiếp cận bắt buộc, bởi vì nó tự động xử lý nhiều danh mục và nó có thể được mở rộng cho các yếu tố hoặc ngoại lệ khác bằng cách chỉ cần thêm một mẫu phù hợp khác. Lập trình mà không có nhánh if .
Lưu ý: không có thứ như null
trong XML. Có xsi: nil , nhưng điều đó hiếm khi được sử dụng, đặc biệt hiếm khi trong các tình huống chưa được xử lý mà không có lược đồ nào đó.