Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 为什么substring-before()在XSLT中对我不起作用?_Xml_String_Xslt_Xslt 1.0 - Fatal编程技术网

Xml 为什么substring-before()在XSLT中对我不起作用?

Xml 为什么substring-before()在XSLT中对我不起作用?,xml,string,xslt,xslt-1.0,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

我试图使用一些字符串函数提取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> 
我试图实现的是提取文件名的一部分,ccyymdd。当我运行它时,第一条消息正确地显示splitchar;第二条消息返回值“some”;但第三条消息的结果为空


我使用的是XSLT 1.0。

EXSLT str:split函数返回一个节点集,因为这是XSLT 1.0中唯一可用的数据结构,应用于节点集时,将显示第一个节点的字符串值,并忽略所有其他节点。类似地,应用于节点集中的子字符串before将处理集中的第一个节点,并忽略其余节点

您真的不能前进到XSLT2.0吗

但第三条消息的结果为空

结果为空,因为:

str:split($A,$fileDateSplitChar)[last()]
返回xml,并且:

substring-before('xml, 'xml')" 
返回一个空字符串

我试图实现的是提取文件的一部分 年月日

我假设您不知道该部分的顺序位置,只知道它在最后一个之前,因此可以使用以下方法提取:

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

人类和其他任何自然力量一样,总是沿着阻力最小的道路前进。在.NET framework本机或任何主要浏览器中都不支持XSLT 2.0。在这之前,找到XSLT1.0解决方案所需的工作量要比找到如何安装和使用第三方库所需的工作量小得多。这甚至可能不需要太多的努力,但感知是相关的。很遗憾,但这是真的。我认为生活在微软生态系统中的人类尤其如此。幸运的是,他们只是少数。这个解决方案奏效了,谢谢。并没有想到那个。改进了标题以更好地匹配问题。格式化示例XML以提高可读性。固定资本化。使标记反映有问题的XSLT1.0规范。根据约定消除一般性帮助/感谢信息。