将多个xslt字符串操作串接在一起

将多个xslt字符串操作串接在一起,xslt,Xslt,我尝试在xslt 1.0中执行以下命令: <xsl:element name="{substring-before(concat('dc:',substring-after(name(),'.')),'.')}"> <xsl:apply-templates/> </xsl:element> 我在这一行得到了一个运行时错误,但是如果我在前一行的命令之前删除子字符串,它就会工作。我猜我在某个地方犯了语法错误,但不确定是什么(因为我是xslt新手)

我尝试在xslt 1.0中执行以下命令:

 <xsl:element name="{substring-before(concat('dc:',substring-after(name(),'.')),'.')}">
    <xsl:apply-templates/>
 </xsl:element>

我在这一行得到了一个运行时错误,但是如果我在前一行的命令之前删除子字符串,它就会工作。我猜我在某个地方犯了语法错误,但不确定是什么(因为我是xslt新手)。有没有关于我做错了什么的指示?我想一个问题可能是,如果没有找到针字符串,子字符串在返回之前会做什么


谢谢。

如果$haystack不包含$Pionel的实例,那么($haystack,$Pionel)之前的子字符串将返回空字符串

您没有犯语法错误,但几乎可以肯定您犯了逻辑错误。让我们一路往上走。假设当前元素的名称为
ns:abc
,或
ns:def.ghi
ns:jkl.mno.pqr
之一

  • (name(),“.”之后的表达式
    子字符串返回“”,“ghi”或“mno.pqr”

  • concat
    表达式将
    dc:
    添加到开头,因此我们有“dc:”、“dc:ghi”或“dc:mno.pqr”

  • 完整表达式在连接结果中搜索“.”,并返回“.”之前的子字符串或空字符串,因此我们得到了三个测试用例的“,”和“pqr”


  • 如果您猜测如果没有匹配项,
    之前的
    子字符串和
    之后的
    子字符串返回整个字符串,那么现在您知道了真相。

    如果您可以提供运行时错误消息,这将很有帮助。另外,您当前所在的元素的名称(包括名称空间前缀)是什么?(即“name()”返回什么?)此字符串操作的目标是什么?除非原始节点名中有两个句点,否则最终结果将为空。是的,这是我的问题,我检查并注意到它返回一个空字符串,因此出现运行时错误,因为元素不能是空字符串。非常好的解释肯定会帮助其他可能犯同样逻辑错误的人。