Атрибут соответствия XSLT и применение CSS - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь сопоставить атрибут аудитория = "эксперт" или аудитория = "новичок"

и применить его к элементу html как атрибут класса и атрибут аудитория .

xml:

<section audience="expert" xml:id="section-1">
    <title>Some Title</title>
    <para audience="novice">Lorem ipsum dolore amet</para>
</section>

мой шаблон xslt:

<xsl:template mode="main" match="section">
    <section class="d-inline-block">
        <xsl:apply-templates/>
    </section>
</xsl:template>

<xsl:template match="@audience">
    <div>
        <xsl:attribute name="audience">
            <xsl:value-of select="@audience"/>
        </xsl:attribute>
        <xsl:apply-templates/>
    </div>
</xsl:template>

Ожидаемый результат:

<div class="audience" audience="expert">
    Some Title
    <div class="audience" audience="novice">
       Lorem ipsum dolore amet
    </div>
</div>

Но это не будет совпадать.

Когда я сопоставляю para , это работает, но я сопоставлю раздел и пункт с одним шаблоном с атрибутом

<xsl:template match="para">
        <p>
            <xsl:if test="@audience">
                <xsl:attribute name="class">audience</xsl:attribute>
                <xsl:attribute name="audience">
                    <xsl:value-of select="@audience"/>
                </xsl:attribute>
            </xsl:if>
            <xsl:apply-templates/>
        </p>
    </xsl:template>

1 Ответ

0 голосов
/ 20 сентября 2018

Проблема с использованием <xsl:apply-templates/>.Это сокращение для <xsl:apply-templates select="node()" />, где node() выбирает элементы, текстовые узлы, комментарии и инструкции по обработке.Он не выбирает атрибуты.

Вам необходимо заменить <xsl:apply-templates/> этим, чтобы затем он выбрал атрибуты

<xsl:apply-templates select="@*|node()" />

Также обратите внимание, что в шаблоне, соответствующем @audience, выдолжен делать <xsl:value-of select="."/> вместо <xsl:value-of select="@audience"/>, поскольку вы уже позиционированы на атрибуте аудитории, поэтому просто хотите получить текущее значение.

<xsl:template match="@audience">
  <div>
    <xsl:attribute name="audience">
        <xsl:value-of select="."/>
    </xsl:attribute>
    <xsl:apply-templates/>
  </div>
</xsl:template>

Или, что еще лучше, используйте здесь шаблоны значений атрибутов

<xsl:template match="@audience">
  <div audience="{.}">
    <xsl:apply-templates/>
  </div>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...