为什么substring-before()在XSLT中不能为我工作?

时间:2015-04-30 03:17:09

标签: xml string xslt xslt-1.0

我试图使用一些字符串函数在XSLT中提取文件名的一部分,但无法理解为什么它不起作用。

以下是我运行的XSLT示例:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
    xmlns:str="http://exslt.org/strings">
  <xsl:output method="text"/>
  <xsl:variable name="A" >some.filename.test.CCYYMMDD.xml</xsl:variable>
  <xsl:variable name="fileDateSplitChar" select="'.'"/>
  <xsl:template match="/">
    <xsl:text>split char : </xsl:text>
    <xsl:value-of select="str:split($A,$fileDateSplitChar)[last()]"/>
    <xsl:text>split nodeset : </xsl:text>
    <xsl:value-of select="str:split($A,$fileDateSplitChar)"/>
    <xsl:text>substring-before : </xsl:text>
    <xsl:value-of select="substring-before(str:split($A,$fileDateSplitChar)[last()],
                                                                           'xml')"/>
  </xsl:template>
</xsl:stylesheet> 

我想要实现的是提取文件名的一部分CCYYMMDD。当我运行它时,第一条消息正确显示拆分字符;第二条消息返回值'some';但第三条消息的结果是空白的。

我正在使用XSLT 1.0。

2 个答案:

答案 0 :(得分:0)

EXSLT str:split函数返回一个节点集(因为它是关于XSLT 1.0中唯一可用的数据结构)。 <xsl:value-of>,应用于节点集时,显示第一个节点的字符串值,并忽略所有其他节点。类似地,substring-before()在应用于节点集时会处理集合中的第一个节点,并忽略余数。

你真的无法前进到XSLT 2.0吗?

答案 1 :(得分:0)

  

但第三条消息的结果为空白。

结果为空,因为:

str:split($A,$fileDateSplitChar)[last()]

返回“xml”,并且:

substring-before('xml, 'xml')" 

返回一个空字符串。

  

我想要实现的是提取文件的一部分   CCYYMMDD。

我假设你不知道这个部分的序数位置,只知道它是最后一个的位置 - 因此可以使用以下方法提取:

str:split($A,$fileDateSplitChar)[last() - 1]