2008-12-08 37 views
7

Tôi cần trợ giúp về cú pháp XSLT hay không. Đây là kịch bản của tôi, tôi có một tệp XML cần được chuyển đổi sang một giao diện khác của tệp XML, tôi có một số phần trong đó nếu tập nút cụ thể không chứa bất kỳ giá trị nào, toàn bộ phần không được xử lý.Kiểm tra xem tập hợp nút có chứa bất kỳ giá trị nào trong XSLT

Dưới đây là một ví dụ về XML:

<Dates> 
    <Date> 
     <VALUE1></VALUE1> 
     <VALUE2></VALUE2> 
     <VALUE3></VALUE3> 
     <VALUE4></VALUE4> 
     <VALUE5>3333</VALUE5> 
    </Date> 
    <Date> 
     <VALUE1>AAAA</VALUE1> 
     <VALUE2></VALUE2> 
     <VALUE3>JJJJ</VALUE3> 
     <VALUE4></VALUE4> 
     <VALUE5>12345</VALUE5> 
    </Date> 
</Dates> 

screenshot of xml

Đây là XSLT của tôi với câu lệnh if mà không làm việc đúng

<xsl:for-each select="Level1/Level2/Level3"> 
    <xsl:if test="@VALUE1!=''">      
    <MyDates>    
      <value_1> 
       <xsl:value-of select="VALUE1"/> 
      </value_1> 
      <value_2> 
       <xsl:value-of select="VALUE2"/> 
      </value_2> 
      <value_3> 
       <xsl:value-of select="VALUE3"/> 
      </value_3> 
      <value_4> 
       <xsl:value-of select="VALUE4"/> 
      </value_4>  
    </MyDates> 
    </xsl:if> 
</xsl:for-each> 

Như bạn có thể thấy tôi về cơ bản muốn tất cả các nút (VALUE1, VALUE2, VALUE3, v.v ...) có giá trị hoặc không xử lý và chuyển sang phần tiếp theo

(Nếu bạn không thể thấy XML được đưa ra, tôi cũng tạo ảnh chụp màn hình)

+0

XSLT của bạn không được thông qua. –

+0

Có thể nếu bạn bao gồm một đầu ra * mẫu *? – Alastair

+0

@ Alex: Bây giờ bạn có hai câu trả lời hay: Chris Marasti-Georg và Dimitre –

Trả lời

12

Bạn đang cố gắng khớp các phần tử xml với tên "Level1", "Level2", v.v ... không tồn tại trong tài liệu. Sau đó, bạn đang tìm thuộc tính VALUE1 trên phần tử cuối cùng.

tôi nghĩ bạn muốn một cái gì đó như thế này:

<xsl:for-each select="Dates"> 
    <MyDates> 
     <xsl:for-each select="Date"> 
     <xsl:if test="not(*[.=''])"> 
      <MyDate> 
       <value_1> 
        <xsl:value-of select="VALUE1"/> 
       </value_1> 
       <value_2> 
        <xsl:value-of select="VALUE2"/> 
       </value_2> 
       <value_3> 
        <xsl:value-of select="VALUE3"/> 
       </value_3> 
       <value_4> 
        <xsl:value-of select="VALUE4"/> 
       </value_4>    
      </MyDate> 
     </xsl:if> 
     </xsl:for-each> 
    </MyDates> 
</xsl:for-each> 

này sẽ bổ sung thêm một yếu tố chứa ngày mới càng lâu càng mỗi giá trị trong các yếu tố ngày tương ứng là không có sản phẩm nào.

Những gì nó là

  1. Tạo một yếu tố MyDates mới cho mỗi phần tử Ngày.
  2. Kiểm tra từng yếu tố Ngày. * phù hợp với tất cả trẻ em. [.=''] có nghĩa là "trống". Cuối cùng, nó kết thúc tốt đẹp tất cả trong một không. Điều này có nghĩa là nếu chỉ chuyển nếu không có bất kỳ đứa trẻ nào trống.
  3. Nếu không có con trống, nó sẽ tạo thành phần MyDate mới với bản sao của mỗi giá trị.

Bạn cũng có thể kiểm tra hướng dẫn W3Schools XSLXPath.

2

@ là dự phòng - nó đề cập đến thuộc tính XML.

Bạn đang cố thử nghiệm một yếu tố, vì vậy, chỉ cần thả @.

Ngoài ra:

  • Level1/level2/Level3 là sai
  • Bạn đang thử nghiệm cho VALUE1 chỉ nhưng muốn kiểm tra cho tất cả các giá trị (có thể được thực hiện với *)
3

Bạn đã không xác định rõ ý nghĩa của "một nút có giá trị".

Rất có thể, bạn sẽ xem xét phần tử có phần tử văn bản không gian màu trắng, không có giá trị. Trong trường hợp này, dưới đây là một trong những giải pháp:

 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
 <xsl:template match="Date[not(*[not(normalize-space())])]"> 
     <xsl:copy-of select="."/> 
    </xsl:template> 

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

templete này cho một yếu tố "Ngày" sẽ không được xuất hiện nếu "Ngày" chứa dù chỉ một phần tử con, mà có không có nội dung hoặc chỉ khoảng trắng.

Khi chuyển đổi này được áp dụng trên các tài liệu sau đây XML:

 
<Dates> 
    <Date> 
     <VALUE1></VALUE1> 
     <VALUE2> </VALUE2> 
     <VALUE3></VALUE3> 
     <VALUE4></VALUE4> 
     <VALUE5>3333</VALUE5> 
    </Date> 
    <Date> 
     <VALUE1>AAAA</VALUE1> 
     <VALUE2>1</VALUE2> 
     <VALUE3>JJJJ</VALUE3> 
     <VALUE4>1</VALUE4> 
     <VALUE5>12345</VALUE5> 
    </Date> 
</Dates> 

Các kết quả chính xác được sản xuất:

 
<Date> 
    <VALUE1>AAAA</VALUE1> 
    <VALUE2>1</VALUE2> 
    <VALUE3>JJJJ</VALUE3> 
    <VALUE4>1</VALUE4> 
    <VALUE5>12345</VALUE5> 
</Date> 
2
<xsl:for-each select="Level1/Level2/Level3"> 
<MyDates> 
    <xsl:if test="VALUE1!=''"> 
     <value_1> 
      <xsl:value-of select="VALUE1"/> 
     </value_1> 
    </xsl:if> 
    <xsl:if test="VALUE2!=''"> 
     <value_2> 
      <xsl:value-of select="VALUE2"/> 
     </value_2> 
    </xsl:if> 
    <xsl:if test="VALUE3!=''"> 
     <value_3> 
      <xsl:value-of select="VALUE3"/> 
     </value_3> 
    </xsl:if> 
    <xsl:if test="VALUE4!=''"> 
     <value_4> 
      <xsl:value-of select="VALUE4"/> 
     </value_4> 
    </xsl:if> 
</MyDates> 

2

Tôi nghĩ rằng bạn có thể d o này cũng có. Thay vì kiểm tra một nút. VALUE1/text() sẽ kiểm tra xem nút có một số văn bản bên trong hay không. Bạn có thể muốn chắc chắn rằng không có không gian màu trắng cho những điều này. Ngoài ra, bạn có thể xem liệu phần tử VALUE1 có nút con không.

<xsl:if test="VALUE1/text()">      

</xsl:if> 

<xsl:if test="VALUE1/child::node()">      

</xsl:if> 
0
<xsl:template match="Dates"> 
<table border="1"> 
<tr bgcolor="#9acd32"><th>NAME</th><th>INVALUE</th></tr> 
<xsl:for-each select="Date"> 
    <xsl:if test="(VALUE1 != '') and (VALUE2 != '') and (VALUE3 != '') and (VALUE4 != '') and (VALUE5 != '')" > 
    <tr><td>VALUE1</td><td><xsl:value-of select="VALUE1"></xsl:value-of></td></tr> 
    <tr><td>VALUE2</td><td><xsl:value-of select="VALUE2"></xsl:value-of></td></tr> 
    <tr><td>VALUE3</td><td><xsl:value-of select="VALUE3"></xsl:value-of></td></tr> 
    <tr><td>VALUE4</td><td><xsl:value-of select="VALUE4"></xsl:value-of></td></tr> 
    <tr><td>VALUE5</td><td><xsl:value-of select="VALUE5"></xsl:value-of></td></tr> 
</xsl:if> 
</xsl:for-each> 
</table> 
</xsl:template> 
</xsl:stylesheet> 
+0

Một chút bình luận? Chỉ cần một bãi chứa mã không phải là một câu trả lời hữu ích ... – vonbrand

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