使用 XSLT 1.0 从几个字母中获取整个字符串



有谁知道如何使用 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() ) 值。

名为 NameFromFirstThreeCharsxsl:template普遍适用于两个参数 nodeselText

相关内容

  • 没有找到相关文章

最新更新