xslt применить шаблон и сопоставить - PullRequest
2 голосов
/ 28 февраля 2012

это не мой код.но это совпадает с тем, что я хочу, поэтому я использую это здесь.Я получил это от здесь

<xsl:template match="/">
<xsl:apply-templates select="event/details">
<xsl:with-param name="title" select="event/title"/> <!-- pass param "title" to matching templates -->
</xsl:apply-templates>
</xsl:template>

<xsl:template match="details">
<xsl:param name="title"/> <!-- this template takes parameter "title" -->
Title: <xsl:value-of select="$title"/><br/>
Timestamp: <xsl:value-of select="java:DateUtil.getDate(number(timestamp))"/><br/>
Description: <xsl:value-of select="description"/><br/>
</xsl:template>

Моя проблема в том, могу ли я иметь шаблон соответствия "детали" выше с параметром и один без параметра?извините за мой английский .. дайте мне знать, если я не буду иметь смысла, я сделаю все возможное, чтобы перефразировать это.заранее спасибо.

РЕДАКТИРОВАТЬ: вот что я хочу.

template 1 - with parameter:

<xsl:template match="details">
<xsl:param name="title"/> <!-- this template takes parameter "title" -->
Title: <xsl:value-of select="$title"/><br/>
Timestamp: <xsl:value-of select="java:DateUtil.getDate(number(timestamp))"/><br/>
Description: <xsl:value-of select="description"/><br/>
</xsl:template>

template 2 - without parameter:

<xsl:template match="/">
<xsl:apply-templates select="event/details"/>
</xsl:template>

<xsl:template match="details">
Timestamp: <xsl:value-of select="java:DateUtil.getDate(number(timestamp))"/><br/>
Description: <xsl:value-of select="description"/><br/>
</xsl:template>

Ответы [ 2 ]

0 голосов
/ 28 февраля 2012

Ваши два шаблона существенно отличаются тем, что говорят: «Если заголовок был предоставлен, то отобразите его». Для этого вы можете установить для параметра по умолчанию пустую последовательность (в XSLT 2.0 добавьте select="()" к параметру xsl: или в 1.0, select="/..") и добавьте условную логику в шаблон формы "if $ title существует, затем отобразите его ".

0 голосов
/ 28 февраля 2012

I.Это исправимая ошибка - иметь два шаблона с одинаковым шаблоном соответствия - в лучшем случае для выполнения будет выбран только один из них .

В вашем конкретном примере вы можете использовать только шаблонс параметром и слегка измените его код, чтобы, когда параметр не имел значения (пустая строка), заголовок не записывался.

Вот небольшая демонстрация того, как это можно сделать :

<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="/">
        <xsl:apply-templates select="event/details"/>
        ===========
        <xsl:apply-templates select="event/details">
          <xsl:with-param name="title" select="'Title Provided'"/>
        </xsl:apply-templates>

    </xsl:template>

    <xsl:template match="details">
        <xsl:param name="title"/>

    <xsl:value-of select=
    "concat(substring('Title: ',
                      1 + 7*not(string-length($title) > 0)
                      ),
            $title)
    "/>
        <br/> Timestamp: 
        <xsl:value-of select="'someTimeStamp'"/>
        <br/> Description: 
        <xsl:value-of select="description"/>
        <br/>
    </xsl:template>

</xsl:stylesheet>

В этом преобразовании шаблон, соответствующий details, вызывается дважды - первый раз без параметра и второй раз с параметром $title.В обоих случаях шаблон выдает желаемый результат :

<br/> Timestamp: 
        someTimeStamp<br/> Description: 
        <br/>
        ===========
        Title: Title Provided<br/> Timestamp: 
        someTimeStamp<br/> Description: 
        <br/>

II.xsl:function в XSLT 2.0

То, чего вы хотите, может быть достигнуто с помощью xsl:function - функций, написанных на XSLT - эта функция доступна только в XSLT 2.0 (и выше).Вполне возможно написать разные перегрузки одной и той же функции, и у нас есть много примеров этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...