2011-01-07 9 views
3

das folgende XML-Fragment Gegeben:Kann in XSL "none" gefunden werden?

<foo> 
    <bar>1</bar> 
    <bar>2</bar> 
    <bar>3</bar> 
</foo> 

Die folgende XSL funktionieren soll:

<xsl:template match="/"> 
    <xsl:apply-templates 
    mode="items" 
    select="bar" /> 
</xsl:template> 

<xsl:template mode="items" match="bar"> 
    <xsl:value-of select="." /> 
</xsl:template> 

Gibt es eine Möglichkeit ich ein ähnliches Format wie diese verwenden kann, um eine Vorlage gelten, wenn gibt es keine<bar/> Einheiten? Zum Beispiel:

<xsl:template match="/"> 
    <xsl:apply-templates 
    mode="items" 
    select="bar" /> 
</xsl:template> 

<xsl:template mode="items" match="bar"> 
    <xsl:value-of select="." /> 
</xsl:template> 

<xsl:template mode="items" match="none()"> 
    There are no items. 
</xsl:template> 
+0

Gute Frage, +1. Siehe meine Antwort für die Exlanation und eine vollständige, kurze Lösung, die nur Templates und keine expliziten bedingten XSLT-Anweisungen verwendet. :) –

Antwort

2

Man könnte auch dieses Muster verwenden zusätzliche wählt zu vermeiden:

<xsl:template match="/*"> 
    <xsl:apply-templates select="bar" mode="items"/> 
    <xsl:apply-templates select="(.)[not(bar)]" mode="show-absence-message"/> 
</xsl:template> 

<xsl:template match="bar" mode="items"> 
    <xsl:value-of select="."/> 
</xsl:template> 

<xsl:template match="/*" mode="show-absence-message"> 
    There are no items. 
</xsl:template> 
+0

Arbeitete perfekt! Vielen Dank!! –

1

Nein, wenn Sie apply-templates select="bar" und der Kontextknoten hat keine bar Kind-Elemente dann keine Knoten verarbeitet werden, und daher werden keine Vorlagen angewandt. Sie könnten jedoch Ihren Code in der Vorlage ändern, indem Sie die Anwendungsvorlagen auf z.

<xsl:choose> 
    <xsl:when test="bar"> 
     <xsl:apply-templates select="bar"/> 
    </xsl:when> 
    <xsl:otherwise>There are not items.</xsl:otherwise> 
    </xsl:choose> 
5

Ja.

Aber die Logik sein sollte:

<xsl:template match="foo"> 
    <xsl:apply-templates select="bar"/> 
</xsl:template> 

<xsl:template match="foo[not(bar)]"> 
    There are no items. 
</xsl:template> 

Hinweis: Es ist foo Element, das ist oder Umstecken nicht bar Kinder.

+0

+1. Bessere Antwort. – Flack

+0

Upvoted, aber ich bin mit @ Flacks Antwort gegangen, da es manchmal nicht möglich ist, den übergeordneten Kontext zu verwenden. –

+0

@digitala: Kein Problem. Aber ** es ist immer möglich, dieses Muster zu verwenden **. @ Flacks Antwort verwendet einen ** Push-Stil ** ('xsl: apply-tempates/@ select') und Modi (' xsl: apply-tempates/@ mode') anstelle von diesem ** pull style **. –

0

das folgende XML-Fragment Gegeben:

<foo> 
    <bar>1</bar> 
    <bar>2</bar> 
    <bar>3</bar> 
</foo> 

Die folgende XSL funktionieren sollte:

<xsl:template match="/"> 
<xsl:apply-templates mode="items" select="bar" /> 
</xsl:template> 

<xsl:template mode="items" match="bar"> 
<xsl:value-of select="." /> 
</xsl:template> 

Nein, die obige <xsl:apply-templates> wählt überhaupt keinen Knoten.

Gibt es eine Möglichkeit ich ein ähnliches Format dazu verwenden kann, eine Vorlage anzuwenden, wenn es keine Einheiten sind?

Ja:

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

    <xsl:template match="/*[not(bar)]"> 
     No <bar/> s. 
    </xsl:template> 

    <xsl:template match="/*[bar]"> 
     <xsl:value-of select="count(bar)"/> <bar/> s. 
    </xsl:template> 
</xsl:stylesheet> 

wenn der bereitgestellten XML-Dokument angelegt:

<foo> 
    <bar>1</bar> 
    <bar>2</bar> 
    <bar>3</bar> 
</foo> 

das Ergebnis ist:

3<bar/> s. 

Wenn auf diese XML-Dokument angewendet:

<foo> 
    <baz>1</baz> 
    <baz>2</baz> 
    <baz>3</baz> 
</foo> 

das Ergebnis ist:

No <bar/> s. 
Verwandte Themen