有没有人知道如何使用xslt 1.0从前3个字母中获取全名?
<node>
<name>Shelly</name>
<name>Roger</name>
<name>Tommy</name>
<name>Ginger</name>
</node>
例如,我希望能够循环遍历以下xml节点,并且当它循环到包含'tom'的字符串时(类似于:contains(// name,'tom ') ),并从列表中输出全名'Tommy'。
我认为它会是这样的: for-each // node / name /,查找包含'tom'的值,然后输出(。)该值。
这可能吗?
谢谢。
答案 0 :(得分:1)
您需要使用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>
答案 1 :(得分:0)
哎呀...脑屁......很容易:
<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)"/>
答案 2 :(得分:0)
完整的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
进行比较。如果这是匹配项,则会返回text()
变量的{$node
)值。
名为xsl:template
的{{1}}普遍适用于NameFromFirstThreeChars
和node
两个参数。