2010-02-24 28 views
11

Hi am xây dựng một mẫu chung để liệt kê nội dung của tôi. Nhưng Nội dung có thể được sắp xếp trên các @ hoặc nút khác nhau(). Vì vậy, muốn vượt qua xPath trongSử dụng các Biến trong <xsl: sort select = "" />

<xsl:variable name="sort" select="@sortBy"/> 
<xsl:variable name="order" select="@order"/> 

<xsl:for-each select="Content[@type=$contentType]"> 
    <xsl:sort select="$sort" order="{$order}" data-type="text"/> 
    <xsl:sort select="@update" order="{$order}" data-type="text"/> 
    <xsl:copy-of select="."/> 
</xsl:for-each> 

. Sử dụng một biến để thả tăng dần hoặc giảm dần vào order="" TRÌNH.

Tại sao không thể thực hiện điều này trên select=""?

Tôi hy vọng biến siêu động này thành biến động có thể là xPtah hoặc @publish hoặc Title/node() hoặc bất kỳ xPath nào.

Không có lỗi - Nó chỉ bỏ qua sắp xếp.

+0

Thông số W3c cho biết; xsl: sắp xếp có thuộc tính chọn có giá trị là biểu thức. và biểu thức được delared như; Biểu thức xảy ra dưới dạng giá trị của các thuộc tính nhất định trên các phần tử được xác định XSLT và trong dấu ngoặc nhọn Khi tôi thêm dấu ngoặc nhọn, tôi nhận được lỗi biên dịch XSLT ...: { –

+0

Câu hỏi hay (+1). Xem câu trả lời dưới đây :) –

Trả lời

13

Đây là theo thiết kế. Thuộc tính select là thuộc tính duy nhất không chấp nhận AVT (Thuộc tính - Mẫu giá trị).

Giải pháp thông thường là xác định biến có tên của phần tử con sẽ được sử dụng làm khóa sắp xếp. Dưới đây là một ví dụ nhỏ:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:variable name="vsortKey" select="'b'"/> 
<xsl:variable name="vsortOrder" select="'descending'"/> 

<xsl:template match="/*"> 
    <xsl:for-each select="*"> 
    <xsl:sort select="*[name() = $vsortKey]" order="{$vsortOrder}"/> 

    <xsl:copy-of select="."/> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

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

<t> 
    <a> 
    <b>2</b> 
    <c>4</c> 
    </a> 
    <a> 
    <b>5</b> 
    <c>6</c> 
    </a> 
    <a> 
    <b>1</b> 
    <c>7</c> 
    </a> 
</t> 

kết quả mong muốn được sản xuất:

<a> 
    <b>5</b> 
    <c>6</c> 
    </a> 
<a> 
    <b>2</b> 
    <c>4</c> 
    </a> 
<a> 
    <b>1</b> 
    <c>7</c> 
</a> 
+0

Hmmm, vâng, tôi đã thử điều này ... ngoại trừ; Tôi cần sắp xếp theo @attribute hoặc child :: * –

0

Các | (nhà điều hành công đoàn) hoạt động ... Tôi phải làm cho nó hơi sai khi thử trước đây. Đó là câu trả lời của @Dimitre Novatchev dẫn tôi xuống con đường bên phải !!

Các công trình sau đây:

<xsl:sort select="@*[name()=$sort] | *[name()=$sort]" 
      order="{$order}" data-type="text"/> 

Nó cho phép tôi để sắp xếp trên các thuộc tính và các nút. Rõ ràng, miễn là chúng không có cùng giá trị name().

+1

@Will: Vui lòng không đăng lên phần dưới của trang trừ khi bạn đăng câu trả lời thực sự. StackOverflow không giống như một diễn đàn cổ điển. Cảm ơn bạn. ;) – Tomalak

+0

Không phải ... đã nói đây là anser, xin lỗi chút bối rối. –

+0

@Will Hancock: Rất vui khi câu trả lời này hữu ích. Bạn thậm chí có thể xem xét chấp nhận nó :) –

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