我正在使用由开箱即用的Java 6提供的XSL引擎来转换文档。
我需要从属性中获取一个值,并将其用作要转换到的文档中的索引属性。
例如,元素:
<myElem bogen="K [1]"/>属性“bogen”可能具有以下值:
“K1”“K2”达到'n‘值。它还可以简单地使用"K“来表示与”K1“相同的内容。
相应的转换结果(来自“K1”)如下所示:
<myTransformedElem index="1"/>我可以利用这个转换:
<xsl:value-of select="translate(@bogen,translate(@bogen, '0123456789', ''), '')"/>如果只是被期望为“K1”的值。但是如果没有实际的数字,比如"K",这就把我塞满了。
我唯一能做到的方法是,如果我滥用'number‘函数,期望得到一个'NaN’并翻译它。这看起来太丑了。
例如:
<xsl:value-of select="translate(string(number(translate(@bogen,translate(@bogen, '0123456789', ''), ''))), 'aN', '1')"/>每次都能得到正确的结果。
在XSLT中是否有更好、更好的方法来做到这一点而不诉诸自定义方法(即导入静态java方法)?
例如,如果我需要一个多字符字符串的默认值,我就不能使用上面的解决方案。
提前谢谢。
肖恩
发布于 2014-02-07 08:02:36
使用此XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="myElem">
<xsl:choose>
<xsl:when test="translate(@bogen, '0123456789', '') != @bogen">
<myTransformedElem index="{translate(@bogen,translate(@bogen, '0123456789', ''), '')}"/>
</xsl:when>
<xsl:otherwise>
<myTransformedElem index="1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>应用于此XML时:
<root>
<myElem bogen="K"/>
</root>产生
<myTransformedElem index="1"/>当应用于此XML时:
<root>
<myElem bogen="K [2]"/>
</root>产生
<myTransformedElem index="2"/>发布于 2014-02-07 08:05:55
有一种方法可以做到这一点:
<xsl:template name="GetIndex">
<xsl:param name="value" />
<xsl:param name="default" select="1" />
<xsl:variable name="foundIndex"
select="substring-before(
substring-after($value, '['), ']')" />
<xsl:choose>
<xsl:when test="$foundIndex">
<xsl:value-of select="$foundIndex"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$default"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>此调用生成值1。
<xsl:call-template name="GetIndex">
<xsl:with-param name="value" select="'K[1]'" />
</xsl:call-template>此调用生成值37。
<xsl:call-template name="GetIndex">
<xsl:with-param name="value" select="'K[37]'" />
</xsl:call-template>此调用生成值1。
<xsl:call-template name="GetIndex">
<xsl:with-param name="value" select="'K'" />
</xsl:call-template>此调用生成值999。
<xsl:call-template name="GetIndex">
<xsl:with-param name="value" select="'K'" />
<xsl:with-param name="default" select="999" />
</xsl:call-template>如果您发现xsl:choose太冗长,您可以这样重写GetIndex并获得相同的结果:
<xsl:template name="GetIndex">
<xsl:param name="value" />
<xsl:param name="default" select="1" />
<xsl:variable name="foundIndex"
select="substring-before(
substring-after($value, '['), ']')" />
<xsl:value-of select="concat($foundIndex,
substring($default, 1,
not($foundIndex) *
string-length($default)))"/>
</xsl:template>就我个人而言,我认为xsl:choose的版本更清晰,即使它更长。
https://stackoverflow.com/questions/21622138
复制相似问题