2011-12-14 45 views
9

Tôi có chuỗi đầu vào có giá trị csv. Ví dụ: 1,2,3 Tôi sẽ cần phải tách riêng từng giá trị và gán cho nút đích trong vòng lặp for-each.XSLT phân tách chuỗi phân cách bằng dấu phẩy cho nút cho mỗi nút

Tôi nhận mẫu dưới đây chia tách chuỗi đầu vào dựa trên dấu phân cách. Làm thế nào tôi có thể gán từng giá trị phân cách cho phần tử đích trong vòng lặp for-each.

<xsl:template name="output-tokens"> 
<xsl:param name="list"/> 
<xsl:param name="delimiter"/> 
<xsl:variable name="newlist"> 
    <xsl:choose> 
    <xsl:when test="contains($list, $delimiter)"> 
     <xsl:value-of select="normalize-space($list)"/> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="concat(normalize-space($list), $delimiter)"/> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 
<xsl:variable name="first" select="substring-before($newlist, $delimiter)"/> 
<xsl:variable name="remaining" 
       select="substring-after($newlist, $delimiter)"/> 
<xsl:variable name="count" select="position()"/> 
<num> 
    <xsl:value-of select="$first"/> 
</num> 
<xsl:if test="$remaining"> 
    <xsl:call-template name="output-tokens"> 
    <xsl:with-param name="list" select="$remaining"/> 
    <xsl:with-param name="delimiter"> 
     <xsl:value-of select="$delimiter"/> 
    </xsl:with-param> 
    </xsl:call-template> 
</xsl:if> 
</xsl:template> 

Input xml:

<out1:AvailableDates> 
<out1:AvailableDate>15/12/2011,16/12/2011,19/12/2011,20/12/2011,21/12/2011</out1:AvailableDate> 
</out1:AvailableDates> 

Dự kiến ​​Output:

<tns:AvailableDates> 
<tns:AvailableDate>15/12/2011</tns:AvailableDate> 
<tns:AvailableDate>16/12/2011</tns:AvailableDate> 
<tns:AvailableDate>120/12/2011</tns:AvailableDate> 
</tns:AvailableDates> 

Trả lời

14

Dưới đây là đầy đủ và ngắn gọn, đúng một giải pháp XSLT 1.0:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:out1="undefined" xmlns:tns="tns:tns" 
    exclude-result-prefixes="out1 tns"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="out1:AvailableDate"> 
    <tns:AvailableDates> 
    <xsl:apply-templates/> 
    </tns:AvailableDates> 
</xsl:template> 

<xsl:template match="text()" name="split"> 
    <xsl:param name="pText" select="."/> 
    <xsl:param name="pItemElementName" select="'tns:AvailableDate'"/> 
    <xsl:param name="pItemElementNamespace" select="'tns:tns'"/> 

    <xsl:if test="string-length($pText) > 0"> 
    <xsl:variable name="vNextItem" select= 
     "substring-before(concat($pText, ','), ',')"/> 

     <xsl:element name="{$pItemElementName}" 
        namespace="{$pItemElementNamespace}"> 
     <xsl:value-of select="$vNextItem"/> 
     </xsl:element> 

     <xsl:call-template name="split"> 
     <xsl:with-param name="pText" select= 
         "substring-after($pText, ',')"/> 
     <xsl:with-param name="pItemElementName" select="$pItemElementName"/> 
     <xsl:with-param name="pItemElementNamespace" select="$pItemElementNamespace"/> 
     </xsl:call-template> 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 

khi áp dụng trên tài liệu XML cung cấp (điều chỉnh được thực hiện tốt được hình thành):

<out1:AvailableDates xmlns:out1="undefined"> 
    <out1:AvailableDate>15/12/2011,16/12/2011,19/12/2011,20/12/2011,21/12/2011</out1:AvailableDate> 
</out1:AvailableDates> 

mong muốn, kết quả chính xác được tạo ra:

<tns:AvailableDates xmlns:tns="tns:tns"> 
    <tns:AvailableDate>15/12/2011</tns:AvailableDate> 
    <tns:AvailableDate>16/12/2011</tns:AvailableDate> 
    <tns:AvailableDate>19/12/2011</tns:AvailableDate> 
    <tns:AvailableDate>20/12/2011</tns:AvailableDate> 
    <tns:AvailableDate>21/12/2011</tns:AvailableDate> 
</tns:AvailableDates> 
+0

Cảm ơn bạn rất nhiều. Tuyệt vời – Arun

+0

@Arun: Tôi rất vui vì câu trả lời của tôi hữu ích. Bạn có thể, vui lòng đánh dấu câu trả lời là được chấp nhận (nhấp vào dấu kiểm bên cạnh câu trả lời)? Đây là cách thức bày tỏ lòng biết ơn chính thức tại SO. –

+0

Chắc chắn. Trong XSL của tôi, tôi nhận được mesage: là các thành phần được phép duy nhất cho phép