xslt как добавить атрибуты в копию - PullRequest
28 голосов
/ 04 июня 2010

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

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

В файле XML узел /root/Algemeen/foto/ содержит изображение HTML, например: image

What I would like to do is to add a fixed width to the image. But the following doesn't work:


     100 </ xsl: attribute>
</ XSL: копирование из>

1 Ответ

46 голосов
/ 04 июня 2010

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

Вы захотите использовать xsl:copy, а затем добавить дополнительные узлы внутри. xsl:copy просто копирует атрибуты узла и пространства имен, но не обычные атрибуты и дочерние узлы, поэтому вам нужно убедиться, что вы apply-templates также протолкнете другие узлы. xsl:copy не имеет @select, оно работает на текущем узле, поэтому, где бы вы ни применяли <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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...