2010-08-03 46 views
7

Giving loại tập tin XML:CONCATENATE nhiều thuộc tính giá trị

<data> 
    <row val="3"/> 
    <row val="7"/> 
    <row val="2"/> 
    <row val="4"/> 
    <row val="3"/> 
</data> 

tôi cần phải lấy chuỗi '3; 7; 2; 4; 3' sử dụng XPath 1.0 vì vậy mà tôi có thể tạo liên kết động cho Dịch vụ biểu đồ của Google trong ứng dụng XForms của tôi.

Tôi có thể làm như thế nào? Có thể không?

Trả lời

8

XPath giải pháp 2.0:

string-join(/data/row/@val,';') 

XSLT 1.0 giải pháp:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:template match="row"> 
     <xsl:value-of select="concat(substring(';',1,position()-1),@val)"/> 
    </xsl:template> 
</xsl:stylesheet> 

EDIT: XSLT Ngắn 1.0 giải pháp.

+0

+1 cho thủ thuật 'concat()'. :-) – Tomalak

+0

Giải pháp XSLT 1.0 không có ý nghĩa. 'position()' đánh giá thành 2, 4, 6, 8 và 10 với ví dụ, tại sao nó lại ở đó? Ngoài ra, điều này sẽ xuất mỗi giá trị trên một dòng mới và thụt vào. – Stijn

1

Không thể có trong XPath (ít nhất, không phải trong XPath 1.0, mà tôi cho là phiên bản bạn có).

Sử dụng XSLT, đây sẽ là dễ dàng:

<xsl:template match="/data"> 
    <!-- select all rows for processing --> 
    <xsl:apply-templates select="row" /> 
</xsl:template> 

<!-- rows are turned into CSV of their @val attributes --> 
<xsl:template match="row"> 
    <xsl:value-of select="@val" /> 
    <xsl:if test="position() &lt; last()"> 
    <xsl:text>;</xsl:text> 
    </xsl:if> 
</xsl:template> 

XPath là một ngôn ngữ lựa chọn, không phải là một ngôn ngữ xử lý. Bạn có thể xử lý các nút trong bất kỳ ngôn ngữ lập trình nào khác cung cấp hỗ trợ XML và XPath - XSLT chỉ là một trong các tùy chọn.

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