XSLT问题:在字符串中搜索子字符串“”“或”>“

时间:2011-05-06 16:39:56

标签: xml xslt xpath

我正在学习XSLT,目前我真的陷入困境,无法找到解决方案。如果你能帮助我,我真的很感激。 在你的下方可以找到一个例子

$ string的值:

<img src="Afbeeldingen_Hotpot/beer.jpg" alt="afbeelding van een beer" title="beer" width="170" height="144" style="display:block; margin-left:auto; margin-right:auto; text-align:center;" style="float:center;" />

我的目标是过滤出图像的高度......在本例中为“144”。 functx:我从这个网站获得的字符串索引:http://www.xsltfunctions.com/xsl/functx_index-of-string.html

这是我现在使用的XSLT代码:

    <xsl:variable name="positionHeight" as="xs:integer"><xsl:value-of select="functx:index-of-string($string,'height=') + 8"/></xsl:variable>
    <xsl:variable name="partStringHeight" as="xs:string"><xsl:value-of select="substring($string,$positionHeight)"/></xsl:variable>
    <xsl:variable name="lengthHeight" as="xs:integer"><xsl:value-of select="functx:index-of-string($partStringHeight,'style=' - 3)"/></xsl:variable>
    <xsl:variable name="height" as="xs:string"><xsl:sequence select="substring($partStringHeight,1,$lengthHeight)"/></xsl:variable>

在我想要使用的XSLT代码下面,但是因为“”“的字符串索引为零而给出错误。

    <xsl:variable name="positionHeight" as="xs:integer"><xsl:value-of select="functx:index-of-string($string,'height=') + 8"/></xsl:variable>
    <xsl:variable name="partStringHeight" as="xs:string"><xsl:value-of select="substring($string,$positionHeight)"/></xsl:variable>
    <xsl:variable name="lengthHeight" as="xs:integer"><xsl:value-of select="functx:index-of-string($partStringHeight,'&quot;' - 1)"/></xsl:variable>
    <xsl:variable name="height" as="xs:string"><xsl:sequence select="substring($partStringHeight,1,$lengthHeight)"/></xsl:variable>

有没有办法获得子串的索引,如:

&quot; and &amp;#x003E;

因为我有很多字符串,所以我需要高度,但“style =”不会发生..

1 个答案:

答案 0 :(得分:2)

XSLT中的常用解决方案是将不方便的字符串放入变量的值(不使用select):

<xsl:variable name="quot">"</xsl:variable>

然后

<xsl:variable name="lengthHeight" as="xs:integer"
   select="functx:index-of-string($partStringHeight,$quot) - 1" />

另请注意,您已将- 3- 1 置于<{1}}括号内。当然你想从index-of-string()返回值中减去3或1?因为从index-of-string()中减去3或1是没有意义的。

此外,在变量定义体内使用"通常是多余的。我删除了它。

最后,您可以使用<xsl:value-of />substring-before()轻松获得所需内容:

substring-after()

实际上我不确定你的问题是你在顶部显示的输入字符串值是在XML解析之前还是之后。如果是在解析之后,即字符串数据本身包含<xsl:variable name="beforeHeight" as="xs:integer">height="</xsl:variable> <xsl:variable name="afterHeight" as="xs:string">" style=</xsl:variable> <xsl:variable name="height" as="xs:string" select="substring-before(substring-after($string, $beforeHeight), $afterHeight)" /> 而不是&quot;,那么请输入",但您需要将&quot;转义为&

&amp;

在这种情况下,您的字符串中不会有引号,因此您不需要将值放在这样的变量中;但是可读性可能是个好主意。

同样,<xsl:variable name="beforeHeight" as="xs:integer">height=&amp;quot;</xsl:variable> <xsl:variable name="afterHeight" as="xs:string">&amp;quot; style=</xsl:variable> 需要转发为&amp;#x003e