2010-04-04 31 views
10

Điều tôi đang cố gắng làm là khá đơn giản, nhưng tôi không thể tìm được cách. Tôi chỉ muốn lặp lại các con của một nút trừ con đầu tiên.Loại trừ đứa trẻ đầu tiên với XSL-T

Ví dụ, trong đoạn XML này, tôi muốn tất cả các <bar> yếu tố, ngoại trừ thứ nhất:

<foo> 
    <Bar>Example</Bar> 
    <Bar>This is an example</Bar> 
    <Bar>Another example</Bar> 
    <Bar>Bar</Bar> 
</foo> 

Không có thuộc tính phổ biến mà tôi có thể lọc (như thẻ id hoặc một cái gì đó tương tự).

Mọi đề xuất?

+0

Câu hỏi hay (+1). Xem câu trả lời của tôi cho một giải pháp hoàn chỉnh. –

Trả lời

11

Bạn luôn có thể sử dụng position cùng với xsl:when.

<xsl:when test="node[position() > 1]"> 
    <!-- Do my stuff --> 
</xsl:when> 
+0

... và tôi cảm thấy giống như một n00b. '' Cảm ơn bạn. – zneak

+0

@zneak - tất cả chúng ta đều có ... quá nhiều thứ để giữ trong não của chúng ta cùng một lúc. – Oded

+0

'node.position()! = 1' không phải là biểu thức XPath đúng cú pháp. –

4
/foo/Bar[position() > 1] 

Ví dụ, trong C#:

[Test] 
public void PositionBasedXPathExample() 
{ 
    string xml = @"<foo> 
        <Bar>A</Bar> 
        <Bar>B</Bar> 
        <Bar>C</Bar> 
        </foo>"; 

    XDocument xDocument = XDocument.Parse(xml); 
    var bars = xDocument.XPathSelectElements("/foo/Bar[position() > 1]") 
     .Select(element => element.Value); 

    Assert.That(bars, Is.EquivalentTo(new[] { "B", "C" })); 
} 
1

Sử dụng apply-templates:

<xsl:apply-templates select="foo/Bar[position() > 1]" /> 

hoặc xpath tương tự cho for-each:

<xsl:for-each select="foo/Bar[position() > 1]"> 
    … 
</xsl:for-each> 
3

/foo/bar[position() > 1]

chọn tất cả bar yếu tố ngoại trừ những người đầu tiên, đó là con của các yếu tố hàng đầu, đó là foo.

(//bar)[position() >1]

chọn tất cả các yếu tố trong bar trong bất kỳ tài liệu XML, với ngoại lệ của phần tử đầu tiên bar trong tài liệu này.

+0

Tôi hiểu. Cảm ơn bạn. :) – zneak

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