以FXSL的t:mult3文件中的testFunc-curry.xsl文件为例,我稍微修改了它,使前2个参数是序列。这些序列似乎失去了任何空洞的项目时,咖喱。
<xsl:function name="foo:bar" as="xs:anyAtomicType">
<xsl:param name="headers" as="xs:string*"/>
<xsl:param name="row" as="xs:anyAtomicType*"/>
<xsl:param name="column" as="xs:string"/>
<xsl:message select="$column"/>
<xsl:message select="count($row)"/>
<xsl:value-of select="$row[index-of($headers, $column)]"/>
</xsl:function>当直接调用时,或者当前两个参数被匆匆调用时,如果row序列没有空(string)项,这是很好的。但是,如果其中一个row项是空的(例如,考虑CSV样式的输入,其中列的值(如下面的test_col_two )是可选的。注意,标题是强制性的,取自CSV的第一行):
<xsl:variable name="row" select="tokenize(.,',')"/>
<xsl:variable name="rw" select="foo:bar($headers, $row)"/>
<xsl:message select="$rw"/>
<xsl:variable name="a" select="f:apply($rw,'test_col_one')"/>
<xsl:variable name="b" select="f:apply($rw,'test_col_two')"/>
<xsl:variable name="c" select="f:apply($rw,'test_col_three')"/>
<xsl:message select="concat($a,$b,$c)"/>如果test_col_two为空,变量b将包含test_col_three的值,而不是test_col_two的值。
我是否误解了这个例子,或者这是FXSL的一个问题?
我可以看到,foo:bar($headers, $row)的XML确实包含了表示空字符串的空元素,因此从我所看到的内容中至少在一开始就正确地捕获了这些信息。
下面是完整代码。
<xsl:import href="fxsl-xslt2/f/func-curry.xsl"/>
<foo:bar/>
<xsl:function name="foo:bar" as="node()">
<xsl:sequence select="document('')/*/foo:bar[1]"/>
</xsl:function>
<xsl:function name="foo:bar" as="xs:anyAtomicType">
<xsl:param name="headers" as="xs:string*"/>
<xsl:param name="row" as="xs:anyAtomicType*"/>
<xsl:param name="column" as="xs:string"/>
<xsl:message select="$column"/>
<xsl:message select="count($row)"/>
<xsl:value-of select="$row[index-of($headers, $column)]"/>
</xsl:function>
<xsl:function name="foo:bar" as="node()">
<xsl:param name="headers" as="xs:string*"/>
<xsl:sequence select="f:curry(foo:bar(), 3, $headers)"/>
</xsl:function>
<xsl:function name="foo:bar" as="node()">
<xsl:param name="headers" as="xs:string*"/>
<xsl:param name="row" as="xs:anyAtomicType*"/>
<xsl:sequence select="f:curry(foo:bar(), 3, $headers, $row)"/>
</xsl:function>
<xsl:template match="foo:bar" mode="f:FXSL">
<xsl:param name="arg1" as="xs:string*"/>
<xsl:param name="arg2" as="xs:anyAtomicType*"/>
<xsl:param name="arg3" as="xs:string"/>
<xsl:sequence select="foo:bar($arg1,$arg2,$arg3)"/>
</xsl:template>发布于 2018-03-19 14:59:47
看着
<xsl:function name="int:makeArg" as="element()">
<xsl:param name="arg1"/>
<arg>
<xsl:choose>
<xsl:when test="exists($arg1[2])">
<xsl:attribute name="s"/>
<xsl:for-each select="$arg1">
<e t="{f:type(.)}"><xsl:sequence select="."/></e>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="t" select="f:type($arg1)"/>
<xsl:sequence select="$arg1"/>
</xsl:otherwise>
</xsl:choose>
</arg>
</xsl:function>
<xsl:function name="int:getArg">
<xsl:param name="pargNode" as="element()*"/>
<xsl:sequence select=
"if(not($pargNode/@s))
then
if(not($pargNode/@t) or $pargNode/@t = 'xml:node')
then $pargNode/node()
else
f:apply(f:Constructor($pargNode/@t), $pargNode/node() )
else
for $varg in $pargNode/e/node()
return
if(not($varg/../@t) or $varg/../@t = 'xml:node')
then $varg
else
f:apply(f:Constructor($varg/../@t), $varg )
"
/>
</xsl:function>在用int:makeArg创建参数并用int:getArg处理的地方,似乎makeArg设置了一个e元素,其值为原始arg作为内容(<e t="{f:type(.)}"><xsl:sequence select="."/></e>),然后getArg与for $varg in $pargNode/e/node()一样期望e中有一个子节点。但是,如果序列中包含空字符串,那么我认为这种方法将空字符串作为xsl:sequence select="''",在e元素中不构造任何子节点,然后带有e/node()的getArg显然无法找到该参数。因此,看起来FXSL在那里有一些缺陷,可能是重写。
for $varg in $pargNode/e/node()
return
if(not($varg/../@t) or $varg/../@t = 'xml:node')
then $varg
else
f:apply(f:Constructor($varg/../@t), $varg )作为
for $varg in $pargNode/e
return
if(not($varg/@t) or $varg/@t = 'xml:node')
then $varg/node()
else
f:apply(f:Constructor($varg/@t), $varg )就够了。希望DimitreNovatchev @DimitreNovatchev作为库的作者能够告诉您更多关于这个问题的信息。
https://stackoverflow.com/questions/49352680
复制相似问题