2010-06-23 29 views
10

Tôi có đoạn code xml folowing:XSLT: substring-trước

<weather-code>14 3</weather-code> 
<weather-code>12</weather-code> 
<weather-code>7 3 78</weather-code> 

Bây giờ tôi muốn chỉ lấy số đầu tiên của mỗi nút để thiết lập một hình nền. Vì vậy, đối với mỗi nút tôi có xslt folowing:

<xsl:attribute name="style"> 
    background-image:url('../icon_<xsl:value-of select="substring-before(weather-code, ' ')" />.png'); 
</xsl:attribute> 

Vấn đề là chuỗi con trước đó không trả lại bất cứ điều gì khi không có khoảng trống. Bất kỳ cách nào dễ dàng xung quanh điều này?

Trả lời

17

Bạn có thể sử dụng xsl:whencontains:

<xsl:attribute name="style"> 
    <xsl:choose> 
    <xsl:when test="contains(weather-code, ' ')"> 
     background-image:url('../icon_<xsl:value-of select="substring-before(weather-code, ' ')" />.png'); 
    </xsl:when> 
    <xsl:otherwise>background-image:url('../icon_<xsl:value-of select="weather-code" />.png');</xsl:otherwise> 
    </xsl:choose> 
</xsl:attribute> 
+0

1: Tôi sẽ đi theo cùng một cách. – Manish

+0

Điều kiện Xslt là ICK! Tôi thích giải pháp của Ledhund, nhưng điều này là chính xác về mặt kỹ thuật. – Armstrongest

1

Bạn có thể sử dụng functx:substring-before-if-contains

Chức năng functx:substring-before-if-contains thực hiện substring-before, trả lại toàn bộ chuỗi nếu nó không chứa delimiter. Nó khác với hàm được xây dựng trong fn:substring-before, trả về một chuỗi có độ dài bằng không nếu không tìm thấy dấu phân tách.

Nhìn vào the source code, nó thực hiện như sau:

<xsl:function name="functx:substring-before-if-contains" as="xs:string?"> 
<xsl:param name="arg" as="xs:string?"/> 
<xsl:param name="delim" as="xs:string"/> 
<xsl:sequence select= 
    "if (contains($arg,$delim)) then substring-before($arg,$delim) else $arg"/> 
</xsl:function> 
+0

rằng xsl: chuỗi điều có vẻ hữu ích. Tôi đã thực hiện phương pháp của Oded, nhưng tôi chắc chắn sẽ cung cấp cho một thử một lần sau một khuôn mặt một cái gì đó tương tự. –

20

Bạn có thể chắc chắn rằng luôn luôn có một không gian, có lẽ không phải là đẹp nhất nhưng ít nhất nó nhỏ gọn :)

<xsl:value-of select="substring-before(concat(weather-code, ' ') , ' ')" /> 
+1

+1 gây ra nó rất nhỏ gọn :) –

+0

+1 tránh điều kiện dẫn đến các vấn đề khác trong trường hợp sử dụng tôi có –

+0

+1 suy nghĩ phi tuyến tính. Tôi thích. – Armstrongest