第一次转换后的子串文本节点

时间:2017-11-08 11:28:01

标签: xml xslt xslt-1.0

我有以下XML

<?xml version="1.0" encoding="UTF-8"?>
<foo>
  <element>
     <name>abc</name>
  </element>
  <element>
     <name>de</name>
  </element>
  <element>
     <name>fg</name>
  </element>
  <element>
     <name>ijkl</name>
  </element>
</foo>

我想连接所有名称,但只从该值中获取前四个字符(不是前四个元素,而是字符)。所以输出应该看起来像

<something>abcd</something>

这就是我所拥有的。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/foo">
   <something>
     <xsl:for-each select="element">
       <xsl:value-of select="name"/>
     </xsl:for-each>
   </something>
</xsl:template>
</xsl:stylesheet>

我的问题是我不知道如何在XSLT处理期间只选择前四个字母。有没有办法用XSLT实现这一目标?

2 个答案:

答案 0 :(得分:1)

你应该尝试这样的事情:

<xsl:value-of select="substring(name, 1, 4)"/>

您可以找到更多常规信息here

答案 1 :(得分:0)

您不感兴趣的是每个name的前4个字符,而是前4个字符 从所有连接的名称。所以必须:

  • 加入所有name元素的文字。
  • 从结果中取前4个字符。

你可以这样做:

<xsl:variable name="txt">
  <xsl:for-each select=".//name">
    <xsl:value-of select="." />
  </xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($txt,1,4)"/>

XSLT 2 中,它会更容易:

<xsl:value-of select="substring(string-join(.//name, ''), 1, 4)"/>

所以也许你应该继续 XSLT 2