【问题标题】:XSLT problem: Search in strings for substring """ or ">"XSLT 问题:在字符串中搜索子字符串 """ 或 ">"
【发布时间】:2011-05-06 16:39:55
【问题描述】:

我正在学习 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:index-of-string: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=”..

【问题讨论】:

    标签: xml xslt xpath


    【解决方案1】:

    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 放在 index-of-string() 括号内。您确定要从index-of-string()返回值 中减去3 或1?因为从" 中减去 3 或 1 并没有任何意义。

    此外,在像这样的变量定义主体中使用&lt;xsl:value-of /&gt; 通常是多余的。我删除了它。

    最后,您可以使用substring-before()substring-after() 轻松获得您想要的东西:

    <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)" />
    

    实际上,我不确定您在顶部显示的输入字符串值是在 XML 解析之前还是之后。如果是解析后,即字符串数据本身包含&amp;quot;而不是",则放入&amp;quot;,但需要将&amp;amp;转义为&amp;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;amp;amp;#x003e 需要转义为&amp;amp;amp;#x003e

    【讨论】:

    • 哇,感谢您的明确解释!字符串在转换之前......可惜我现在必须去,但我明天会检查它!!​​!
    • 感谢您的帮助!它现在可以工作并使用 substring-before 和 after 更好! :)
    猜你喜欢
    • 1970-01-01
    • 2015-02-05
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 2011-07-04
    • 1970-01-01
    相关资源
    最近更新 更多