有谁知道如何使用 xslt 1.0 从前 3 个字母中获取全名?
<node>
<name>Shelly</name>
<name>Roger</name>
<name>Tommy</name>
<name>Ginger</name>
</node>
例如,我希望能够遍历以下 xml 节点,当它循环到包含"tom"的字符串时(类似于:contains(//name,'tom'),并从列表中输出全名"Tommy"。
我假设它会是这样的:对于每个//node/name/,找到包含 'tom' 的值,然后输出 (.) 该值。
这可能吗?
谢谢。
使用 starts-with
函数。您正在寻找的表达式是,
<xsl:for-each select="node/name[starts-with(., 'Tom')]">
虽然,你可能想参数化它,就像这样...
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:param name="name" select="'Tom'" />
<xsl:template match="/">
<xsl:for-each select="node/name[starts-with(., $name)]">
<p><xsl:value-of select="." /></p>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
请注意,这是区分大小写的。如果要不区分大小写,则在 XSLT 1.0 中还需要做更多的工作...
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:variable name="l" select="'abcdefghijklmnopqrstuvwxyz'" />
<xsl:variable name="u" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
<xsl:param name="name" select="'tom'" />
<xsl:template match="/">
<xsl:for-each select="node/name[starts-with(translate(., $u, $l), translate($name, $u, $l))]">
<p><xsl:value-of select="." /></p>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
哎呀...脑子放屁...这很简单:
<xsl:variable name="vSuffix">
<xsl:for-each select="//*[local-name()='name']">
<xsl:copy-of select="substring-after(.,'tom')"/>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="concat('tom',$vSuffix)"/>
完整的 XSLT-1.0 解决方案是:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="text" encoding="utf-8" omit-xml-declaration="no"/>
<xsl:strip-space elements="*" />
<xsl:variable name="lower" select="'abcdefghijklmnopqrstuvwxyz'" />
<xsl:variable name="upper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
<xsl:template match="/node/name">
<xsl:call-template name="NameFromFirstThreeChars">
<xsl:with-param name="node" select="." />
<xsl:with-param name="selText" select="'rog'" /> <!-- example for 'Roger' -->
</xsl:call-template>
</xsl:template>
<xsl:template name="NameFromFirstThreeChars">
<xsl:param name="node" />
<xsl:param name="selText" />
<xsl:variable name="upperSel" select="translate($selText,$lower,$upper)" />
<xsl:if test="starts-with(translate($node,$lower,$upper), $upperSel)">
<xsl:value-of select="$node" />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
此解决方案执行从小写字母到大写字母的转换,然后将前三个(或您喜欢的任何)字符与参数 $selText
进行比较。如果这是匹配项,则返回$node
变量的 (text()
) 值。
名为 NameFromFirstThreeChars
的xsl:template
普遍适用于两个参数 node
和 selText
。