Как создать необязательно сгенерированное значение атрибута класса с помощью XSLT

#php #xslt

#php #xslt

Вопрос:

Я собираюсь использовать XSLT, и я не могу понять, как я могу генерировать динамически добавляемое имя класса. Например class="has-title column-4" , я хочу создать классическое значение класса, разделенное пробелами.

 // Original XML string..
<contents>
    <box type="list" mark="kr-con">
        <li>test texts..</li>
        <li>test texts..</li>
        ..
        <li>test texts..</li>
    </box>
</contents>
  

После обработки XSLT.. Я хочу получить,

 <div class="box box-list column-1">
    <li>test texts..</li>
    <li>test texts..</li>
    .. (processed elements)
    <li>test texts..</li>
</div>
  

В исходном xml box[@type] имеет значение по умолчанию list , поэтому исходная строка xml не имеет этого атрибута, хотя результат имеет box-list класс.
Кроме того, box[@column] атрибут не существует, но имеет значение по умолчанию 1 и ведет к column-1 классу.

..

что-то вроде этого..

Я пробовал так много часов, и я не думаю, что смогу справиться с этим .. XSL. Очень расстраивает.. но все равно нужно..

Как я могу сгенерировать значение класса?

Я пытаюсь создать некоторую переменную с помощью <xsl:variable> тега, но все больше и больше идет не так..


После просмотра ответов и некоторых попыток.. Я получил ниже..

 <!-- figure 처리 -->
<xsl:template match="figure">
    <!-- align 속성 처리 -->
    <xsl:variable name="align">
        <xsl:choose>
            <xsl:when test="not(@align) and parent::p and position()=1">
                <xsl:value-of select="'right'"/>
            </xsl:when>
            <xsl:when test="not(@align)">
                <xsl:value-of select="'center'"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="@align"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <!-- width 처리 -->
    <xsl:variable name="width">
        <xsl:choose>
            <xsl:when test="not(@width)">
                <xsl:value-of select="'width-6'"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="@width"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <!-- 주 요소 처리 -->
    <xsl:choose>
        <xsl:when test="parent::li">
            <img src="{@url}" class="width-12"/>
        </xsl:when>
        <xsl:otherwise>
            <img src="{@url}" class="align-{@align} {@width}"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
  

lol ~

Ответ №1:

Я не уверен, что действительно понимаю, что вы пытаетесь сделать, но это должно дать вам пример для начала.

В XSLT 1.0

 <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="contents/box">
    <xsl:variable name="box">
        <xsl:choose>
            <xsl:when test="@type='list'">
                <xsl:value-of select="'box-list'"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="@type"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <xsl:variable name="col">
        <xsl:choose>
            <xsl:when test="@column">
                <xsl:value-of select="@column"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="'1'"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    
    <div class="{concat('box',' ',$box,' ','column-',$col)}">
        <xsl:copy-of select="li"/>
    </div>
  </xsl:template>
  
</xsl:stylesheet>
  

Посмотрите, как это работает здесь: https://xsltfiddle .liberty-development.net/3MEcZxw

Комментарии:

1. Спасибо, и я помню тебя. Я верю, что вы много раз учили меня в этом сообществе. Очень ценю все ваши усилия. Я решаю эту проблему с помощью вашей подсказки.