#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. Спасибо, и я помню тебя. Я верю, что вы много раз учили меня в этом сообществе. Очень ценю все ваши усилия. Я решаю эту проблему с помощью вашей подсказки.