Есть ли какой-либо шаблон "функция узла" в XSLT? - PullRequest
1 голос
/ 29 августа 2011

Вот код, который я использую:

<xsl:template match="Row[position() = 1]">
  <li style="width: 650px; float: left; list-style: none outside none;">
    <ul class="liste1">
      <xsl:if test="@Style='NewsCustomTemplate'">
        <li>
          <div style="width:640px; color:#40494f; font-size:12">
            <b style="color:black">
              <xsl:value-of select="./@Title"/>
            </b>
            <xsl:choose>
              <xsl:when test="string-length(./@Description)&gt;300">
                <xsl:value-of disable-output-escaping="yes" select="substring(./@Description,1,300)"/>...
              </xsl:when>
              <xsl:otherwise>
                <xsl:value-of disable-output-escaping="yes" select="./@Description"/>
              </xsl:otherwise>
            </xsl:choose>
          </div>
          <div>
            <a class="" href="#" target="" title="">
              read more
            </a>
          </div>
        </li>
        <xsl:if test="following-sibling::*[1]">
          <li>
            <div style="width:640px; color:#40494f; font-size:12">
              <b style="color:black">
                <xsl:value-of select="following-sibling::*[1]/@Title"/>
              </b>
              <xsl:choose>
                <xsl:when test="string-length(following-sibling::*[1]/@Description)&gt;300">
                  <xsl:value-of disable-output-escaping="yes" select="substring(following-sibling::*[1]/@Description,1,300)"/>...
                </xsl:when>
                <xsl:otherwise>
                  <xsl:value-of disable-output-escaping="yes" select="following-sibling::*[1]/@Description"/>
                </xsl:otherwise>
              </xsl:choose>
            </div>
            <div>
              <a class="" href="#" target="" title="">
                read more
              </a>
            </div>
          </li>
        </xsl:if>
        <xsl:if test="following-sibling::*[2]">
          <li>
            <div style="width:640px; color:#40494f; font-size:12">
              <b style="color:black">
                <xsl:value-of select="following-sibling::*[2]/@Title"/>
              </b>
              <xsl:choose>
                <xsl:when test="string-length(following-sibling::*[2]/@Description)&gt;300">
                  <xsl:value-of disable-output-escaping="yes" select="substring(following-sibling::*[2]/@Description,1,300)"/>...
                </xsl:when>
                <xsl:otherwise>
                  <xsl:value-of disable-output-escaping="yes" select="following-sibling::*[2]/@Description"/>
                </xsl:otherwise>
              </xsl:choose>
            </div>
            <div>
              <a class="" href="#" target="" title="">
                read more
              </a>
            </div>
          </li>
        </xsl:if>
      </xsl:if>
      <xsl:if test="@Style='AgendaCustomTemplate'">
      </xsl:if>
    </ul>
  </li>
</xsl:template>

Проблема моего кода в том, что я повторяю почти один и тот же код три раза:

  • один длятекущий элемент "."
  • один для первого родного брата "follow-sibling :: * [1]"
  • один для второго родного брата "follow-sibling :: * [2]"

Я хотел бы иметь своего рода общий шаблон для выполнения этой части для узла LOCATIONX:

<li>
  <div style="width:640px; color:#40494f; font-size:12">
    <b style="color:black">
      <xsl:value-of select="LOCATIONX/@Title"/>
    </b>
    <xsl:choose>
      <xsl:when test="string-length(LOCATIONX/@Description)&gt;300">
        <xsl:value-of disable-output-escaping="yes" select="substring(LOCATIONX/@Description,1,300)"/>...
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of disable-output-escaping="yes" select="LOCATIONX/@Description"/>
      </xsl:otherwise>
    </xsl:choose>
  </div>
  <div>
    <a class="" href="#" target="" title="">
      read more
    </a>
  </div>
</li>

Кто-нибудь знает, возможно ли такое в XSLT?Или я должен сохранить мой код дублированным?

1 Ответ

3 голосов
/ 30 августа 2011

Начните с избавления от этого disable-output-escaping = "yes".Вероятно, он был помещен туда как волшебная волшебная пыль кем-то, кто не знает, что это значит.Скорее всего, это не нужно, и в этом случае его удаление не повредит;если преобразование не работает без него, то с дизайном что-то не так.

Что касается вашего вопроса, поместите общий код внутри

<xsl:template match="Row" mode="m">...</xsl:template>

и затем выполните

<xsl:template match="Row[position()=1]">
  <xsl:apply-templates select="." mode="m"/>
  <xsl:apply-templates select="following-sibling::Row[1]" mode="m"/>
  <xsl:apply-templates select="following-sibling::Row[2]" mode="m"/>
</xsl:template>

или более просто

<xsl:template match="Row[position()=1]">
  <xsl:apply-templates select=".|following-sibling::Row[3 > position()]" mode="m"/>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...