2010-10-12 32 views
5

là có thể bỏ qua các nút trong khi xử lý tệp xml. ví dụ nói rằng tôi có mã xml saubỏ qua các nút bằng XSLT

<mycase desc=""> 
    <caseid> id_1234 </caseid> 
    <serid ref=""/>  
    ...... 
    ...... 
    ...... 
</mycase> 

và tôi muốn làm cho nó trông như thế này

<mycase desc="" caseid="id_1234"> 
..... 
..... 
</mycase> 

Hiện tại tôi đang làm điều này

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:stylesheet version="2.0" exclude-result-prefixes="xs xdt err fn" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:fn="http://www.w3.org/2005/xpath-functions" 
      xmlns:xdt="http://www.w3.org/2005/xpath-datatypes" 
      xmlns:err="http://www.w3.org/2005/xqt-errors"> 

      <xsl:output method="xml" indent="yes"/> 
      <xsl:template match="/"> 
      <xsl:apply-templates/> 
      </xsl:template> 

     <xsl:template match="mycase">   
      <xsl:element name="mycase"> 
       <xsl:attribute name="desc"/> 
       <xsl:attribute name="caseid"> 
       <xsl:value-of select="caseid"/> 
       </xsl:attribute> 
       <xsl:apply-templates/> 
      </xsl:element> 
     </xsl:template> 
     ...... 
     ...... 

này tạo ra những gì tôi muốn nó nhưng vì

<xsl:apply-template/> 

nó xử lý tất cả các nút. trong khi tôi muốn nó bỏ qua xử lý caseid và serid tất cả lại với nhau. Điều này cũng áp dụng cho các nút khác, sẽ không có sẵn trong cấu trúc XML mới. Vậy làm cách nào tôi có thể bỏ qua các nút mà tôi không muốn xử lý bằng xslt.

regards, Ehsan

Trả lời

8

Bạn có thể sử dụng các mẫu sản phẩm nào để ngăn chặn đầu ra của các nút nhất định trong tài liệu đầu vào của bạn:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="mycase"> 
    <mycase caseid="{caseid}"> 
     <xsl:apply-templates select="@*|node()"/> 
    </mycase> 
    </xsl:template> 

    <xsl:template match="caseid|serid"/> 

    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

+1 Câu trả lời hay. –

2

sử dụng <xsl:apply-templates select="mycase"/> thay vì <xsl:apply-templates />

Về cơ bản, những gì bạn cần làm là áp dụng các mẫu trên chỉ là một bộ nút cụ thể. Trong trường hợp của bạn chỉ là các nút 'mycase'.

4

Có lẽ cách dễ nhất để làm điều này, là thêm một mẫu phù hợp với caseid, và có nó không làm gì cả, như thế này:

<xsl:template match="caseid"/> 

Bằng cách thêm số này vào XSL hiện tại của bạn, phần tử caseid bị bỏ qua.

Một giải pháp khác sẽ được chỉ sử dụng xsl:apply-elements trên các yếu tố không phù hợp với tên caseid, tức là .:

<xsl:template match="mycase">   
     <xsl:element name="mycase"> 
      <xsl:attribute name="desc"/> 
      <xsl:attribute name="caseid"> 
      <xsl:value-of select="caseid"/> 
      </xsl:attribute> 
      <xsl:apply-templates select="*[name() != 'caseid']"/> 
     </xsl:element> 
</xsl:template> 

Hope this helps, chúc may mắn!

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