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

时间:2017-02-01 17:56:42

标签: xml xslt 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'。

我认为它会是这样的: for-each // node / name /,查找包含'tom'的值,然后输出(。)该值。

这可能吗?

谢谢。

3 个答案:

答案 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}}普遍适用于NameFromFirstThreeCharsnode两个参数。