2012-02-13 15 views
6

Jak używać szablonów stosowania, aby wybierać tylko te elementy według nazwy (bez wartości), które kończą się określonym wzorcem? Zakładamy następujące xml ...Jak wybrać elementy według części ich nazwy w XSL/XPath?

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

chcę użyć <xsl:apply-templates> na wszystkich wystąpień <report_item> gdzie elementy potomne kończyć „adj`, więc, w tym przypadku, tylko monthly_adj, quaterly_adj i ytd_adj zostanie wybrany i zastosowany z szablonem.

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

Odpowiedz

10

Nie sądzę, że składnia wyrażeń regularnych jest dostępna w tym kontekście, nawet w XSLT 2.0. Ale nie potrzebujesz tego w tym przypadku.

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

* pasuje do każdego węzła

[pred] wykonuje test węzła przed selektora (w tym przypadku *) (gdzie pred oznacza orzeczenie oceniona w kontekście danego węzła)

name() powraca nazwa tagu elementu (w tym celu powinna być odpowiednikiem local-name).

ends-with() to wbudowana funkcja łańcuchowa XPath.

+0

NEW StackOverflow rekord świata .... Najszybsze odpowiedzi Kiedykolwiek, LOL, masz rację, nie regex, tylko proste 'kończy with' było mało, dziękuję. – raffian

+0

Cieszę się, że pomogę :) Zaktualizowałem tytuł, aby lepiej pasował do pytania. – harpo

+0

Tak, planowałem aktualizację, jeszcze raz dziękuję! – raffian

2

Lekko neater rozwiązanie (XSLT 2.0+ tylko):

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

Oto autotestu, aby udowodnić, że działa. (Testowany na Saxonie).

<?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

"Mecz" pracował dla mnie. Ale mam problem: http://xsltransform.net/pPzifp5/3 (Chciałbym, aby kolejność 'mOrder' mówiła' li' chciałbym wyświetlić pierwszy, drugi, trzeci ...) Dziękuję. – Si8

+0

Lub coś w tym stylu: http://xsltransform.net/pPzifp5/4 (Szukam wyświetlić nadrzędny LI i sub LI, ale jest to mnożenie dla każdej iteracji i powielania.) Pusty LI Chciałbym nie pokazać i tylko pokaż, czy ma tekst.) Dzięki za pomoc – Si8

+0

Zadaj pytanie, a odpowiedź zostanie udzielona. –

Powiązane problemy