23

我正在尝试编辑当前的 XSLT。我想要的功能是当“//code_no”的值以 01 结尾时,我想编辑当前城市位置。目前此功能不存在。我曾尝试使用字符串和子字符串,但它给了我一个错误,说以功能结尾不存在。请帮忙

来自xml的值是

<code_no>
1870410001
</code_no>

在 xsl 中,我想在值以 01 结尾时打印它。

<td align="left" width="33%"><SPAN style="font-size: 12pt; font-family: Arial;">
    <a> <b><u><xsl:value-of select="//city"/>, <xsl:value-of select="//state"/> 
    </u></b></a></SPAN></td>
4

6 回答 6

43

XPath 1.0 等效于(XPath 2.0)表达式:

ends-with($s, $t)

$t = substring($s, string-length($s) - string-length($t) +1)

您只需将最后一个 XPath 表达式中的$s$t分别替换为要测试的字符串和要测试的结尾。

这是一个完整的例子

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

 <xsl:template match="x|y">
     <xsl:value-of select="name()"/> ends-with '_01': <xsl:value-of select=
     "'_01' = substring(., string-length() - 2)"/>
=============   
 </xsl:template>
</xsl:stylesheet>

当此转换应用于以下 XML 文档时(问题中未提供任何内容!!!):

<t>
 <x>abcd_01</x>
 <y>abcd_11</y>
</t>

产生了想要的正确结果:

x ends-with '_01': true
=============   
 y ends-with '_01': false
=============   
于 2012-08-08T03:13:58.030 回答
3

我用了

contains($string, $part) and normalize-space(substring-after($string, $part)) = ''

在哪里

我们正在检查 $string 是否以 $part 结尾

于 2014-02-27T12:07:02.613 回答
2

XSLT 1.0使用XPath 1.0,它不包括任何名为ends-with. 您可以使用此处找到的技术来伪造它:

于 2012-08-07T15:11:01.683 回答
1

我知道这个问题实际上是一个老问题,但现在我正在寻找同样的问题。

但是,最后我想出了一些其他人将来可能会使用的东西。

请看这个:

contains(concat($str1, '$'), concat($str2, '$'))

快速,简单,无需计算。

使用示例:

    <xsl:variable name="str1" select="string('Some text to test.')" />
    <xsl:variable name="str2" select="string('test.')" />

    <xsl:if test="contains(concat($str1, '$'), concat($str2, '$'))">
        <xsl:value-of select="concat('Yes, text: &quot;', $str1, '&quot; ends with: &quot;', $str2, '&quot;.')"/>
    </xsl:if>

当然,您可以使用任何符号代替 $ 来表示 concat() 函数。

于 2022-01-21T10:00:20.663 回答
0

不完全以 结尾,但比 substring-solution 看起来更好,并且仍然适用于某些情况:

<xsl:template match="*[contains(name(), 'substr')]"/>
于 2014-01-07T11:04:33.163 回答
0

在特殊情况下,如果您知道某些字符不能包含在标记中,例如 §,您可以这样做:

<xsl:if test="contains(concat(code_no,'§'),'01§')">
  <td align="left" width="33%"><SPAN style="font-size: 12pt; font-family: Arial;">
    <a> <b><u><xsl:value-of select="//city"/>, <xsl:value-of select="//state"/> 
    </u></b></a></SPAN></td>
</xsl:if>
于 2019-03-28T13:20:01.210 回答