xslt тест по параметру тега - PullRequest
2 голосов
/ 27 мая 2011

Я хотел бы создать шаблон в xslt с условием параметра соответствующего тега.

для примера: если у меня есть теги <par class="class1"> и <par class="class2">

Я бы хотел создать такой шаблон:

<xsl:template match="par">
 <xsl:if test="class=class1">
  <fo:block
    space-before="3pt"
    space-after="3pt">

    <xsl:apply-templates />

  </fo:block>
 </xsl:if>
 <xsl:otherwise>
  <fo:block
    space-before="10pt"
    space-after="10pt">

    <xsl:apply-templates />

  </fo:block>
 </xsl:otherwise>
</xsl:template>

Но он не работает.Как я могу проверить параметр тега?

заранее спасибо.

Ответы [ 4 ]

4 голосов
/ 27 мая 2011

Сначала <xsl:if/> является "автономной" инструкцией. Вы можете использовать xsl:choose, если вам нужно в случае по умолчанию .

В вашем коде xsl:if test xpath недействительны. Используйте @attribute_name для доступа к атрибутам и одинарные кавычки для строковых литералов.

Фиксированный код:

<xsl:template match="par">
 <xsl:choose>
 <xsl:when test="@class = 'class1'">
  <fo:block
    space-before="3pt"
    space-after="3pt">
    <xsl:apply-templates />
  </fo:block>
 </xsl:when>
 <xsl:otherwise>
  <fo:block
    space-before="10pt"
    space-after="10pt">
    <xsl:apply-templates />
  </fo:block>
 </xsl:otherwise>
 <xsl:choose>
</xsl:template>

Но есть более элегантное решение для вашей задачи:

<xsl:template match="par">
    <fo:block
      space-before="10pt"
      space-after="10pt">

        <xsl:if test="@class = 'class1'">
            <xsl:attribute name="space-before" select="'3pt'"/>
            <xsl:attribute name="space-after" select="'3pt'"/>
        </xsl:if>

        <xsl:apply-templates />

    </fo:block>
</xsl:template>
3 голосов
/ 27 мая 2011

Вы можете использовать другой шаблон вместо <xsl:if>.Например:

<xsl:template match="par[@class='class1']">
  ..
</xsl:template>

<xsl:template match="par">
  ..
</xsl:template>

Второй шаблон используется для любых элементов par, которые не соответствуют первому.Хотя второй шаблон может соответствовать всем par элементам, он переопределяется первым, поскольку последний более конкретен.

2 голосов
/ 27 мая 2011

Технический термин для этих «параметров» - «атрибуты» (на всякий случай, которые помогают при будущих поисках), и вы ссылаетесь на них с помощью @class и т. Д.

Также обратите внимание, что <xsl:otherwise> не для <xsl:if>, а для <xsl:choose>:

<xsl:template match="par">
  <xsl:choose>
    <xsl:when test="@class='class1'">
      <fo:block
        space-before="3pt"
        space-after="3pt">

        <xsl:apply-templates />

      </fo:block>
    </xsl:when>
    <xsl:otherwise>
      <fo:block
        space-before="10pt"
        space-after="10pt">

        <xsl:apply-templates />

      </fo:block>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

Или, чтобы лучше показать фактические различия,

<xsl:template match="par">
  <fo:block>
    <xsl:choose>
      <xsl:when test="@class='class1'">
        <xsl:attribute name='space-before'>3pt</xsl:attribute>
        <xsl:attribute name='space-after'>3pt</xsl:attribute>
      </xsl:when>
      <xsl:otherwise>
        <xsl:attribute name='space-before'>10pt</xsl:attribute>
        <xsl:attribute name='space-after'>10pt</xsl:attribute>
      </xsl:otherwise>
    </xsl:choose>
    <xsl:apply-templates/>
  </fo:block>
</xsl:template>
1 голос
/ 27 мая 2011

Вы получаете доступ к атрибутам, используя @, и можете проверить значение атрибута следующим образом:

<xsl:if test="@class = 'class1'">
    ....
</xsl:if>

или проверить, существует ли атрибут, используя

<xsl:if test="@class">
   ...
</xsl:if>
...