Подтвердить что ты не робот

Xslt как добавить атрибуты для копирования

У меня есть следующий фрагмент кода в моем XSLT файле:

<xsl:copy-of select="/root/Algemeen/foto/node()" />

В XML файле node /root/Algemeen/foto/ хранится изображение HTML, например: < img src= "somephoto.jpg" / >

Что я хотел бы сделать, так это добавить фиксированную ширину к изображению. Но следующее не работает:

<xsl:copy-of select="/root/Algemeen/foto/node()">
    <xsl:attribute name="width">100</xsl:attribute>
</xsl:copy-of>
4b9b3361

Ответ 1

xsl:copy-of выполняет глубокую копию выбранного node, но не дает возможности изменить его.

Вы хотите использовать xsl:copy, а затем добавить дополнительные узлы внутри. xsl:copy просто копирует атрибуты node и namespace, но не обычные атрибуты и дочерние узлы, поэтому вы хотите, чтобы вы apply-templates также проталкивали другие узлы. xsl:copy не имеет @select, он работает с текущим node, поэтому везде, где вы применяете <xsl:copy-of select="/root/Algemeen/foto/node()" /> , вам нужно будет изменить на <xsl:apply-templates select="/root/Algemeen/foto/node()" /> и переместить логику img в шаблон.

Что-то вроде этого:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <result>
    <xsl:apply-templates select="/root/Algemeen/foto/img"/>
        </result>
    </xsl:template>

<!--specific template match for this img -->
    <xsl:template match="/root/Algemeen/foto/img">
      <xsl:copy>
            <xsl:attribute name="width">100</xsl:attribute>
            <xsl:apply-templates select="@*|node()" />
          </xsl:copy>
    </xsl:template>

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

</xsl:stylesheet>