Как я могу добавить атрибуты к текущему значению в XSL? - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь преобразовать HTML-форматирование в CSS через XSL в целях доступности.У меня это работает, но только если там ранее не было атрибута стиля.Как добавить атрибут к тегу стиля, который уже существует?Это мой код для изменения align= на style="text-align: при отсутствии атрибута стиля:

<!-- /align -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="@align">
<xsl:attribute name="style">
<xsl:value-of select="@style"/>
<xsl:attribute name="style" select="concat('text-align: ',.)"/>
</xsl:attribute>
</xsl:template>

Я думал, что предыдущие атрибуты будут включены с использованием value-of перед конкаттацией, но это не работает.Я хочу, чтобы это можно было добавить text-align:, даже если там уже есть тег стиля, например style="border: 1px; text-align:

Редактировать:

Это обновленный кодэто дает мне ошибку:

<!-- /align -->


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

    <xsl:template match="*[@align]">
        <xsl:copy>
            <xsl:apply-templates select="@*[not(local-name() = 'style' or local-name() = 'align')]" />
            <xsl:attribute name="style">
                <xsl:value-of select="@style" />
                <xsl:if test="@style and substring(@style, string-length(@style)) != ';'">; </xsl:if>
                <xsl:apply-templates select="@align" />
            </xsl:attribute>
            <xsl:apply-templates />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="@align">
        <xsl:value-of select="concat('text-align: ', .)"/>
    </xsl:template>

    <!-- /width -->

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

    <xsl:template match="*[@width]">
        <xsl:copy>
            <xsl:apply-templates select="@*[not(local-name() = 'style' or local-name() = 'width')]" />
            <xsl:attribute name="style">
                <xsl:value-of select="@style" />
                <xsl:if test="@style and substring(@style, string-length(@style)) != ';'">; </xsl:if>
                <xsl:apply-templates select="@width" />
            </xsl:attribute>
            <xsl:apply-templates />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="@width">
        <xsl:value-of select="concat('width: ', . , 'px')"/>
    </xsl:template>

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

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Я мог бы рассмотреть возможность использования измененных шаблонов (используя атрибут mode) для атрибутов.

Вот пример XSLT 1.0 (2.0+ можно упростить) ...

Ввод XML

<test align="center" width="100"/>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <!-- This is the identity transform and is only needed once. -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*[@align or @width]">
    <xsl:copy>
      <xsl:apply-templates select="@*[not(local-name()='style') and 
                                      not(local-name()='align') and 
                                      not(local-name()='width')]"/>
      <xsl:attribute name="style">
        <xsl:value-of select="@style" />
        <xsl:if test="@style and substring(@style, string-length(@style)) != ';'">; </xsl:if>
        <xsl:apply-templates select="@*" mode="style"/>
      </xsl:attribute>
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@align" mode="style">
    <xsl:value-of select="concat('text-align: ', ., ';')"/>
  </xsl:template>

  <xsl:template match="@width" mode="style">
    <xsl:value-of select="concat('width: ', . , 'px', ';')"/>
  </xsl:template>

  <xsl:template match="@*" mode="style"/>

</xsl:stylesheet>

Выход

<test style="text-align: center;width: 100px;"/>

Fiddle: http://xsltfiddle.liberty -development.net / bnnZVP / 1

0 голосов
/ 14 февраля 2019

Что вам, вероятно, нужно сделать, это сопоставить родительский элемент, а не сами атрибуты, а затем добавить новый атрибут style, используя содержимое любого существующего, а затем добавить атрибут align.

Попробуйте это XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html" indent="yes"/>

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

  <xsl:template match="*[@align]">
    <xsl:copy>
      <xsl:apply-templates select="@*[not(local-name() = 'style' or local-name() = 'align')]" />
      <xsl:attribute name="style">
        <xsl:value-of select="@style" />
        <xsl:if test="@style and substring(@style, string-length(@style)) != ';'">;</xsl:if>
        <xsl:apply-templates select="@align" />
      </xsl:attribute>
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@align">
     <xsl:value-of select="concat('text-align: ', .)"/>
  </xsl:template>
</xsl:stylesheet>

Обратите внимание, что если вы используете XSLT 2.0, вы можете немного упростить шаблон ...

<xsl:template match="*[@align]">
<xsl:copy>
  <xsl:apply-templates select="@* except (@style, @align)" />
  <xsl:attribute name="style">
    <xsl:value-of select="@style" />
    <xsl:if test="@style and not(ends-with(@style, ';'))">;</xsl:if>
    <xsl:apply-templates select="@align" />
  </xsl:attribute>
  <xsl:apply-templates />
</xsl:copy>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...