2008-10-12 14 views
9

I mają następujące szablonJak sprawdzić, czy tag istnieje w XSLT?

<h2>one</h2> 
<xsl:apply-templates select="one"/> 
<h2>two</h2> 
<xsl:apply-templates select="two"/> 
<h2>three</h2> 
<xsl:apply-templates select="three"/> 

ja jak do wyświetlania nagłówki (jeden, dwa, trzy), jeżeli co najmniej jeden element odpowiedniej matrycy. Jak mogę to sprawdzić?

+0

być dokładniej :) czy twój plik xml, jak chcesz korzystać z tego szablonu? – kender

Odpowiedz

15
<xsl:if test="one"> 
    <h2>one</h2> 
    <xsl:apply-templates select="one"/> 
</xsl:if> 
<!-- etc --> 

Alternatywnie, można utworzyć nazwie szablonu

<xsl:template name="WriteWithHeader"> 
    <xsl:param name="header"/> 
    <xsl:param name="data"/> 
    <xsl:if test="$data"> 
     <h2><xsl:value-of select="$header"/></h2> 
     <xsl:apply-templates select="$data"/> 
    </xsl:if> 
</xsl:template> 

a następnie wywołać jak:

<xsl:call-template name="WriteWithHeader"> 
    <xsl:with-param name="header" select="'one'"/> 
    <xsl:with-param name="data" select="one"/> 
    </xsl:call-template> 

Ale szczerze mówiąc, że wygląda na to więcej pracy dla mnie ... Przydaje się tylko wtedy, gdy rysowanie nagłówka jest złożone ... dla prostego kodu: <h2>...</h2> Byłbym skłonny zostawić to w linii.

Jeżeli tytuł nagłówka jest zawsze nazwa węzła, można simplifiy szablon usuwając „$ header” Arg, i używać zamiast:

<xsl:value-of select="name($header[1])"/> 
2

lubię wykonywać funkcjonalne aspekty XSL który doprowadzi mnie do następnego realizacji:

<?xml version="1.0" encoding="UTF-8"?> 

<!-- test data inlined --> 
<test> 
    <one>Content 1</one> 
    <two>Content 2</two> 
    <three>Content 3</three> 
    <four/> 
    <special>I'm special!</special> 
</test> 

<!-- any root since take test content from stylesheet --> 
<xsl:template match="/"> 
    <html> 
     <head> 
      <title>Header/Content Widget</title> 
     </head> 
     <body> 
      <xsl:apply-templates select="document('')//test/*" mode="header-content-widget"/> 
     </body> 
    </html> 
</xsl:template> 

<!-- default action for header-content -widget is apply header then content views --> 
<xsl:template match="*" mode="header-content-widget"> 
    <xsl:apply-templates select="." mode="header-view"/> 
    <xsl:apply-templates select="." mode="content-view"/> 
</xsl:template> 

<!-- default header-view places element name in <h2> tag --> 
<xsl:template match="*" mode="header-view"> 
    <h2><xsl:value-of select="name()"/></h2> 
</xsl:template> 

<!-- default header-view when no text content is no-op --> 
<xsl:template match="*[not(text())]" mode="header-view"/> 

<!-- default content-view is to apply-templates --> 
<xsl:template match="*" mode="content-view"> 
    <xsl:apply-templates/> 
</xsl:template> 

<!-- special content handling --> 
<xsl:template match="special" mode="content-view"> 
    <strong><xsl:apply-templates/></strong> 
</xsl:template> 

Gdy w ciała wszystkich elementów zawartych w testu elementu mają nagłówka treści widżet zastosowano (w kolejności dokumentu).

Domyślna header-content-widget szablon (dopasowywanie "*") po raz pierwszy stosuje header-view następnie przykłada content-view do bieżącego elementu.

Domyślna header-view szablon umieszcza bieżącego elementu za nazwę w znaczniku h2. Domyślny widok -content-view stosuje ogólne reguły przetwarzania.

Gdy nie ma zawartości zgodnie z oceną [not (text())] orzeczenie nie występuje wyjście dla elementu.

Jednorazowe specjalne skrzynki są łatwo obsługiwane.

Powiązane problemy