избегайте несовпадающих тегов, выводящих HTML с помощью XSLT - PullRequest
1 голос
/ 01 января 2012

Я новичок в XSLT, и есть одна конкретная вещь, которую я не знаю, как сделать, несмотря на часы поиска ответа.

Я выводлю блоки HTML (наборы результатов),и иногда результатом является гиперссылка, иногда это не так.

Простой поток выглядит следующим образом:

<a...> if @url

some HTML code

</a> if @url

Но если я это сделаю:

when @url
<a...>
/when

some HTML code

when @url
</a>
/when

... Мне сказали, что у меня не совпадают теги.

Я использовал текст CDATA для набора привязок, но во многих сообщениях говорится, что это "взломанный" подход.

Iя пытаюсь избежать повторения всего блока HTML-кода только для того, чтобы включить якоря только в одну из них.

Как мне это сделать?

------- edit/ дополнительная информация -----------

Имеет ли это смысл?

            <xsl:template match="Row">

                            <xsl:choose>
                            <xsl:when test="@url!=''">
                                    <a><xsl:attribute name="href"><xsl:value-of select="@url" /></xsl:attribute>
                            </xsl:when>
                            </xsl:choose>       

                                    <img />

                            <xsl:choose>
                            <xsl:when test="@url!=''">
                                    </a>
                            </xsl:when>
                            </xsl:choose>       

            </xsl:template>

Ответы [ 2 ]

3 голосов
/ 02 января 2012

В XSLT ваш вывод представляет собой дерево узлов. Запись узла элемента является одной атомарной операцией; его нельзя разделить на отдельные операции написания начального тега и написания конечного тега. Вы не можете создать половину узла.

Если вы попытаетесь обработать <a> и </a> как отдельные и разделяемые операции, вы получите эту ошибку, потому что таблица стилей должна быть правильно сформированным XML.

Итак, отойдите и объясните, чего вы пытаетесь достичь, а затем мы расскажем вам, как этого добиться правильно в XSLT.

1 голос
/ 02 января 2012

Один из способов рефакторинга XSLT, чтобы условно применить гиперссылку и не повторять логику для получения <img/> (или любой более сложной логики, которую вы пытаетесь избежать повторения), состоит в том, чтобы извлечь эту логику в другуюшаблон (ы) как именованный шаблон или шаблон с @mode.

Например:

  <xsl:template match="Row">
    <xsl:choose>
        <xsl:when test="@url!=''">

          <a>
            <xsl:attribute name="href">
                <xsl:value-of select="@url"/>
            </xsl:attribute>
            <xsl:apply-templates select="." mode="image"/>
          </a>
        </xsl:when>
        <xsl:otherwise>
            <xsl:apply-templates select="." mode="image"/>
        </xsl:otherwise>
   </xsl:choose>             
  </xsl:template>

    <!--The "common" logic to produce an image element, whether or not it will be surrounded by an anchor linking to the @url -->
<xsl:template match="Row" mode="image">
    <img/>
</xsl:template>

Альтернативный способ выполнить то же самое, но с использованиемшаблоны вместо <xsl:choose>:

  <xsl:template match="Row[@url]">
    <a href="@url">
        <xsl:apply-templates select="." mode="image"/>
    </a>
  </xsl:template>

  <xsl:template match="Row">
        <xsl:apply-templates select="." mode="image"/>            
  </xsl:template>

  <xsl:template match="Row" mode="image">
        <img/>
  </xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...