2012-02-13 51 views
6

Làm cách nào để sử dụng các mẫu áp dụng để chỉ chọn các phần tử đó theo tên (không phải giá trị) kết thúc bằng một mẫu cụ thể? Giả xml sau ...Cách chọn các phần tử theo một phần tên của chúng trong XSL/XPath?

<report> 
    <report_item> 
    <report_created_on/> 
    <report_cross_ref/> 
    <monthly_adj/> 
    <quarterly_adj/> 
    <ytd_adj/> 
    </report_item> 
    <report_item> 
    .... 
    </report_item> 
</report> 

Tôi muốn sử dụng <xsl:apply-templates> trên tất cả các trường hợp của <report_item> nơi yếu tố hậu duệ kết thúc với 'adj`, vì vậy, trong trường hợp này, chỉ monthly_adj, quaterly_adj, và ytd_adj sẽ được lựa chọn và được áp dụng với mẫu.

<xsl:template match="report"> 
    <xsl:apply-templates select="report_item/(elements ending with 'adj')"/> 
</xsl:template> 

Trả lời

10

Tôi không nghĩ rằng cú pháp biểu thức chính quy có sẵn trong ngữ cảnh này, ngay cả trong XSLT 2.0. Nhưng bạn không cần nó trong trường hợp này.

<xsl:apply-templates select="report_item/*[ends-with(name(), 'adj')]"/> 

* phù hợp với bất kỳ nút

[pred] thực hiện một thử nghiệm nút chống lại bộ chọn (trong trường hợp này *) (nơi pred là một vị đánh giá trong bối cảnh của nút chọn)

name() lợi nhuận tên thẻ của phần tử (phải tương đương với local-name cho mục đích này).

ends-with() là một hàm chuỗi XPath tích hợp.

+0

MỚI STACKOVERFLOW WORLD RECORD .... Trả lời nhanh nhất, không sao, chỉ đơn giản là 'kết thúc bằng' là đủ, cảm ơn bạn. – raffian

+0

Rất vui được trợ giúp :) Tôi đã cập nhật tiêu đề để phù hợp hơn với câu hỏi. – harpo

+0

Vâng, tôi đã lên kế hoạch để cập nhật bản thân mình, cảm ơn một lần nữa! – raffian

2

giải pháp Hơi gọn gàng (XSLT 2.0+ chỉ):

<xsl:apply-templates select="report_item/*[matches(name(),'adj$')]"/> 

Đây là một tự kiểm tra để chứng minh nó hoạt động. (Thử nghiệm trên Saxon).

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:fn="http://www.w3.org/2005/xpath-functions" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       exclude-result-prefixes="xs fn"> 
<xsl:output method="xml" indent="yes" encoding="utf-8" /> 
<xsl:variable name="report-data"> 
    <report> 
    <report_item> 
    <report_created_on/> 
    <report_cross_ref/> 
    <monthly_adj>Jan</monthly_adj> 
    <quarterly_adj>Q1</quarterly_adj> 
    <ytd_adj>2012</ytd_adj> 
    </report_item> 
    </report> 
</xsl:variable> 
<xsl:template match="/" name="main"> 
    <reports-ending-with-adj> 
    <xsl:element name="using-regex"> 
    <xsl:apply-templates select="$report-data//report_item/*[fn:matches(name(),'adj$')]"/> 
    </xsl:element> 
    <xsl:element name="using-ends-with-function"> 
    <xsl:apply-templates select="$report-data//report_item/*[fn:ends-with(name(), 'adj')]"/> 
    </xsl:element> 
    </reports-ending-with-adj> 
</xsl:template> 
</xsl:stylesheet> 
+0

'Trận đấu' hoạt động cho tôi. Nhưng tôi có một vấn đề: http://xsltransform.net/pPzifp5/3 (Tôi muốn thứ tự 'mOrder' để nói' li' nào tôi muốn hiển thị đầu tiên, thứ hai, thứ ba ...) Cảm ơn bạn. – Si8

+0

Hoặc một cái gì đó như thế này: http://xsltransform.net/pPzifp5/4 (Tôi đang tìm cách để hiển thị các phụ huynh LI và tiểu LI nhưng nó được nhân cho mỗi lần lặp và nhân bản. LI trống tôi muốn không hiển thị và chỉ hiển thị nếu nó có văn bản.) Cảm ơn sự giúp đỡ – Si8

+0

Đăng câu hỏi và câu hỏi sẽ được trả lời. –

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