Можно ли сопоставить «нет» в XSL? - PullRequest
3 голосов
/ 07 января 2011

С учетом следующего фрагмента XML:

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

Должен работать следующий XSL:

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

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

Можно ли использовать аналогичный формат для этого, чтобы применитьшаблон при наличии нет <bar/> сущностей? Например:

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

Ответы [ 4 ]

5 голосов
/ 07 января 2011

Да.

Но логика должна быть:

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

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

Примечание: Это foo элемент, который имеет или нетимея bar детей.

2 голосов
/ 07 января 2011

Можно также использовать этот шаблон, чтобы избежать дополнительных выборов:

<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>
1 голос
/ 07 января 2011

Нет, если у вас есть apply-templates select="bar", а у узла контекста нет дочерних элементов bar, то никакие узлы не обрабатываются и, следовательно, шаблоны не применяются.Тем не менее, вы можете изменить свой код в шаблоне, используя apply-templates, например,

  <xsl:choose>
     <xsl:when test="bar">
        <xsl:apply-templates select="bar"/>
     </xsl:when>
     <xsl:otherwise>There are not items.</xsl:otherwise>
  </xsl:choose>
0 голосов
/ 07 января 2011

Учитывая следующий фрагмент XML:

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

Должен работать следующий XSL:

<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:apply-templates>, приведенный выше, вообще не выбирает ни одного узла .

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

Да :

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

применительно к предоставленному документу XML :

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

результат равен :

3<bar/> s.

При применении к этому документу XML :

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

результат равен :

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