Это преобразование :
<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
в остальном.
.
- значение текущего узла, интерпретируемого как число.