2010-02-25 6 views
5

Tôi có xml có nhiều thành phần và hầu hết chứa các thuộc tính .. đối với một số giá trị thuộc tính giống nhau nên tôi cần nhóm chúng lại và tạo xml khác. I/p Ví dụ:Cách sử dụng nhóm theo xslt

<TestNode> 
<ABC1 value="10.7" format="$" /> 
<ABC2 value="10.5" format="$" /> 
<ABC3 value="20" format="Rs" /> 
<ABC4 value="50" format="Rs" /> 
<ABC5 value="10.5" format="$" /> 
</TestNode> 

Tôi cần nhóm các hàng theo định dạng. Lưu ý: Định dạng không cố định ... nó có thể phát triển ... O/P Ex: là nó có thể để có được? Cảm ơn trước ...

+0

bạn đang sử dụng XSLT 1.0 hay XSLT 2.0? –

+0

Tôi đang sử dụng xslt 1.0. là 2.0 có sẵn trong VS 2008? – Amit

+0

Microsoft không có triển khai XSLT 2.0. Việc thực hiện Saxon.NET có sẵn từ www.saxonica.com. –

Trả lời

4

Trong XSLT 2.0, bạn sẽ có thể làm điều đó với <xsl:for-each-group>, current-grouping-key()current-group()

Ví dụ:

<xsl:for-each-group 
    select="TestNode/*" 
    group-by="@format" 
> 
    <group format="{current-grouping-key()}"> 
     <xsl:for-each select="current-group()"> 
      <xsl:copy-of select="."/> 
     </xsl:for-each> 
    </group> 
</xsl:for-each-group> 

Xem: http://www.w3.org/TR/xslt20/#grouping

+0

Thuộc tính trên xsl: for-each-group được gọi là 'group-by' chứ không phải 'groupby'. Và tại sao mỗi người sao chép từng mục trong nhóm, tại sao không đơn giản thay vì cho từng mục? –

+0

Martin, cảm ơn vì đã chỉ ra lỗi đánh máy trong nhóm. Tôi hy vọng các liên kết đến spec tôi cung cấp không lãng phí trên tất cả những người sao chép nguyên văn đề nghị của tôi. Đối với 'for-each', ý tưởng là đề xuất cách truy cập các mục riêng lẻ trong nhóm. Và thực sự, nếu tất cả những gì bạn muốn làm là sao chép các mục đó, thì có, thực sự bạn chỉ có thể sử dụng một bản sao duy nhất cho rất nhiều. –

5

Trong XSLT 1.0 bạn sẽ sử dụng nhóm Muenchian.

Xác định khóa "định dạng", từ đó chúng tôi có thể dễ dàng chọn tất cả các yếu tố được cung cấp cho tên định dạng. Hơn áp dụng nhóm Muenchian để tìm các định dạng duy nhất trong đầu vào.

Sau đó, nó trở nên đơn giản. Mẫu "*" sẽ được áp dụng một lần cho mỗi định dạng và sử dụng phím() để tìm nạp tất cả các mục nhập cho định dạng đó.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes" /> 

    <xsl:key name="format" match="TestNode/*" use="@format" /> 

    <xsl:template match="TestNode"> 
     <body> 
      <xsl:apply-templates select="*[generate-id(.)=generate-id(key('format',@format)[1])]"/> 
     </body> 
    </xsl:template> 

    <xsl:template match="*"> 
     <format format="{@format}"> 
      <xsl:copy-of select="key('format', @format)" /> 
     </format> 
    </xsl:template> 

</xsl:stylesheet>