установить размер изображения с помощью xsl - PullRequest
2 голосов
/ 07 октября 2010

У меня есть XML, содержащий тег img

<xml>
<img src="/path/to/file.jpg" orginalwidth="150" />
</xml>

Я хочу иметь:

<img src="/paht/to/file.jpg" size=SIZE />

Где РАЗМЕР - минимальный размер оригинала и 100px

Ответы [ 3 ]

3 голосов
/ 07 октября 2010

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:param name="pmaxSize" select="100"/>

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

 <xsl:template match="@orginalwidth">
  <xsl:attribute name="size">
   <xsl:value-of select=".*not(. > $pmaxSize) + $pmaxSize*(. > $pmaxSize)"/>
   <xsl:text>px</xsl:text>
  </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

при выполнении с предоставленным XML-документом :

<xml>
 <img src="/path/to/file.jpg" orginalwidth="150" />
</xml>

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

<xml>
    <img src="/path/to/file.jpg" size="100px"/>
</xml>

при применении к следующему документу XML :

<xml>
 <img src="/path/to/file.jpg" orginalwidth="99" />
</xml>

результат снова искомый и правильный :

<xml>
    <img src="/path/to/file.jpg" size="99px"/>
</xml>

Объяснение

В XPath 1.0 любое логическое значение при использовании в качестве числа преобразуется из true() в 1 и из false() в 0.

Следовательно, выражение:

.*not(. > $pmaxSize) + $pmaxSize*(. > $pmaxSize)

оценивается как ., если . меньше или равно $pmaxSize и $pmaxSize в остальном.

. - значение текущего узла, интерпретируемого как число.

3 голосов
/ 07 октября 2010

Использование XSLT 1.0 (XSLT 2.0, вероятно, дает вам другие возможности, но не уверен, что вы можете его использовать):

<img src="{@src}">
    <xsl:choose>
      <xsl:when test="@originalsize &lt; 100">
        <xsl:attribute name="size"><xsl:value-of select="@originalsize"/></xsl:attribute>
      <xsl:otherwise>
        <xsl:attribute name="size">100</xsl:attribute>
      </xsl:otherwise>
  </xsl:choose>
</img>
1 голос
/ 07 октября 2010

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

<img src="{@src}" size="{substring('100',
                                   1 div (@orginalwidth > 100))
                       }{substring(@orginalwidth,
                                   1 div not(@orginalwidth > 100))
                       }px"/>

РЕДАКТИРОВАТЬ : минимум не максимум, извините.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...