Altova的序列扩展函数可用于XPath和XQuery表达式,并提供用于处理数据的额外功能。本部分中的函数可以与Altova的XPath 3.0和XQuery 3.0引擎一起使用。它们都在XPath/XQuery上下文中可用。
有关函数命名和语言适用性的注意事项
Altova扩展函数可以在XPath/XQuery表达式中使用。除了XPath、XQuery和XSLT标准函数库中可用的功能外,它们还提供了额外的功能。Altova扩展函数在Altova扩展函数命名空间中,http://www.altova.com/xslt-extensions,并在本部分中用altova:前缀表示,假定它与该命名空间绑定。请注意,这些函数可能在未来的产品版本中不被支持,或者个别函数的行为可能会发生变化。有关每个产品版本中对Altova扩展函数的支持的信息,请参见该版本的文档。 XPath函数(用于XSLT中的XPath表达式): | XP1 XP2 XP3.1 | XSLT函数(用于XSLT的XPath表达式): | XSLT1 XSLT2 XSLT3 | XQuery函数(用于XQuery的XQuery表达式): | XQ1 XQ3.1 |
|
altova:attributes(AttributeName as xs:string) as attribute()* XP3.1 XQ3.1 返回所有具有与输入参数AttributeName中提供的名称相同的本地名称的特性。搜索是会考虑大小写的,并沿着attribute::轴进行。这意味着上下文节点必须是父元素节点。 •altova:attributes("MyAttribute") 返回MyAttribute()* |
altova:attributes(AttributeName as xs:string, SearchOptions as xs:string) as attribute()* XP3.1 XQ3.1 返回所有具有与输入参数AttributeName中提供的名称相同的本地名称的特性。搜索会区分大小写,并沿着attribute::轴进行。上下文节点必须是父元素节点。第二个参数是一个包含可选标记的字符串。可选标记如下: r = 切换到正则表达式搜索; AttributeName必须是一个正则表达式搜索字符串; f = 如果已指定该选项,则AttributeName会提供完全匹配;否则AttributeName只需部分匹配一个特性名称即可返回该特性。例如,如果未指定f,则MyAtt将返回MyAttribute; i =切换到区分大小写的搜索; p =在搜索中包括命名空间前缀; AttributeName应包含该命名空间前缀,例如:altova:MyAttribute。 这些标记可以以任何顺序排列。无效的标记将产生错误。一个或多个标记可以被忽略。空字符串是允许使用的,它将产生与使用仅一个参数的函数相同的效果(参见上一个签名)。然而,不允许将空序列作为第二个参数。 •altova:attributes("MyAttribute", "rfip") 返回MyAttribute()* •altova:attributes("MyAttribute", "pri") 返回MyAttribute()* •altova:attributes("MyAtt", "rip") 返回MyAttribute()* •altova:attributes("MyAttributes", "rfip") 返回无匹配项 •altova:attributes("MyAttribute", "") 返回MyAttribute()* •altova:attributes("MyAttribute", "Rip") 返回一个“存在无法识别的标记”错误。 •altova:attributes("MyAttribute", ) 返回一个“缺少第二个参数”错误。 |
|
altova:elements(ElementName as xs:string) as element()* XP3.1 XQ3.1 返回所有具有与输入参数ElementName中提供的名称相同的本地名称的元素。搜索会区分大小写,并沿着child::轴进行。上下文节点必须是被搜索的元素的父节点。 •altova:elements("MyElement") 返回MyElement()* |
altova:elements(ElementName as xs:string, SearchOptions as xs:string) as element()* XP3.1 XQ3.1 返回所有具有与输入参数ElementName中提供的名称相同的本地名称的元素。搜索会区分大小写,并沿着child::轴进行。 上下文节点必须是被搜索的元素的父节点。第二个参数是一个包含可选标记的字符串。可选标记如下: r = 切换到正则表达式搜索; ElementName必须是一个正则表达式搜索字符串; f = 如果已指定该选项,则ElementName会提供完全匹配;否则ElementName只需部分匹配一个元素名称即可返回该元素。例如,如果未指定f,则MyElem将返回MyElement; i =切换到区分大小写的搜索; p =在搜索中包括命名空间前缀; ElementName应包含该命名空间前缀,例如:altova:MyElement。 这些标记可以以任何顺序排列。无效的标记将产生错误。一个或多个标记可以被忽略。空字符串是允许使用的,它将产生与使用仅一个参数的函数相同的效果(参见上一个签名)。然而,不允许使用空序列。 •altova:elements("MyElement", "rip") 返回MyElement()* •altova:elements("MyElement", "pri") 返回MyElement()* •altova:elements("MyElement", "") 返回MyElement()* •altova:elements("MyElem", "rip") 返回MyElement()* •altova:elements("MyElements", "rfip") 返回无匹配项 •altova:elements("MyElement", "Rip") 返回一个“存在无法识别的标记”错误。 •altova:elements("MyElement", ) 返回一个“缺少第二个参数”错误。 |
|
altova:find-first((Sequence as item()*), (Condition( Sequence-Item as xs:boolean)) as item()? XP3.1 XQ3.1 该函数有两个参数。第一个参数是一个包含一个或多个项(数据类型不限)的序列。第二个参数Condition是对一个XPath函数的引用,该函数取一个参数(arity为1)并返回一个布尔值。Sequence中的每一项都会依次提交给在Condition中引用的函数。(请记住:该函数仅取一个参数。)使Condition中的函数评估为true()的第一个Sequence项将作为altova:find-first函数的结果返回,并且迭代停止。 •altova:find-first(5 to 10, function(\$a) {\$a mod 2 = 0}) 返回xs:integer 6 Condition参数引用了XPath 3.0内联函数function(),它声明了一个名为\$a的内联函数,并对其进行定义。altova:find-first 的Sequence参数中的每个项都依次传递给\$a作为其输入值。输入值将根据函数定义中的条件(\$a mod 2 = 0)进行测试。满足该条件的第一个输入值将作为altova:find-first的结果返回(在本例中为6)。 •altova:find-first((1 to 10), (function(\$a) {\$a+3=7})) 返回xs:integer 4 更多示例如果C:\Temp\Customers.xml文件存在: •altova:find-first( ("C:\Temp\Customers.xml", "https://www.altova.com/index.html"), (doc-available#1) ) 返回xs:string C:\Temp\Customers.xml 如果C:\Temp\Customers.xml文件不存在,但https://www.altova.com/index.html存在: •altova:find-first( ("C:\Temp\Customers.xml", "https://www.altova.com/index.html"), (doc-available#1) ) 返回xs:string https://www.altova.com/index.html 如果C:\Temp\Customers.xml文件不存在,并且https://www.altova.com/index.html也不存在: •altova:find-first( ("C:\Temp\Customers.xml", "https://www.altova.com/index.html"), (doc-available#1) ) 返回无结果 有关上方示例的注意事项 •XPath 3.0函数doc-available取一个字符串参数,它被用作URI,如果在提交的URI中找到一个文档节点,则返回true。(因此,提交的URI处的文档必须是一个XML文档。) •doc-available函数可用于Condition,altova:find-first的第二个参数,因为它仅取一个参数(arity=1), 需要取一个item()作为输入(一个用作URI的字符串),并返回一个布尔值。 •请注意,doc-available函数只是被引用,而不是被调用。附在它后面的#1后缀表示该函数的arity为1。总之,doc-available#1表示:使用具有arity=1的doc-availabe()函数,将第一个序列中的每一项依次作为其单一参数传递给它。因此,这两个字符串被传递给doc-available(),它使用字符串作为URI,并测试URI上是否存在一个文档节点。如果有,doc-available()将评估为true(),该字符串将作为altova:find-first函数的结果返回。有关doc-available()函数的注意事项:相对路径是相对于当前基URI解析的,默认情况下,基URI是加载该函数的XML文档的URI。 |
|
|
altova:find-first-combination((Seq-01 as item()*), (Seq-02 as item()*), (Condition( Seq-01-Item, Seq-02-Item as xs:boolean)) as item()* XP3.1 XQ3.1 该函数取三个参数: •前两个参数Seq-01和Seq-02是包含一个或多个项(数据类型不限)的序列。 •第三个参数Condition是对一个XPath函数的引用,该函数取两个参数(arity为2)并返回一个布尔值。 Seq-01和Seq-02中的项将作为有序对(每个序列中取一个项,组成一对)传递,用作Condition中函数的参数。按如下所示生成有序对: If Seq-01 = X1, X2, X3 ... Xn And Seq-02 = Y1, Y2, Y3 ... Yn Then (X1 Y1), (X1 Y2), (X1 Y3) ... (X1 Yn), (X2 Y1), (X2 Y2) ... (Xn Yn) 使Condition函数评估为true()的第一个有序对将作为altova:find-first-combination的结果返回。请注意:(i) 如果Condition函数循环访问提供的参数对,并一次都没有评估为true(),则altova:find-first-combination将返回无结果; (ii) altova:find-first-combination的结果将始终是一个项对(数据类型不限)或不包含任何项。 •altova:find-first-combination(11 to 20, 21 to 30, function(\$a, \$b) {\$a+\$b = 32}) 返回以下序列:xs:integers (11, 21) •altova:find-first-combination(11 to 20, 21 to 30, function(\$a, \$b) {\$a+\$b = 33}) 返回以下序列:xs:integers (11, 22) •altova:find-first-combination(11 to 20, 21 to 30, function(\$a, \$b) {\$a+\$b = 34}) 返回以下序列:xs:integers (11, 23) |
|
altova:find-first-pair((Seq-01 as item()*), (Seq-02 as item()*), (Condition( Seq-01-Item, Seq-02-Item as xs:boolean)) as item()* XP3.1 XQ3.1 该函数取三个参数: •前两个参数Seq-01和Seq-02是包含一个或多个项(数据类型不限)的序列。 •第三个参数Condition是对一个XPath函数的引用,该函数取两个参数(arity为2)并返回一个布尔值。 Seq-01和Seq-02中的项将作为有序对传递,用作Condition中函数的参数。按如下所示生成有序对: If Seq-01 = X1, X2, X3 ...Xn And Seq-02 = Y1, Y2, Y3 ...Yn Then (X1 Y1), (X2 Y2), (X3 Y3) ... (Xn Yn) 使Condition函数评估为true()的第一个有序对将作为altova:find-first-pair的结果返回。请注意:(i) 如果Condition函数循环访问提供的参数对,并一次都没有评估为true(),则altova:find-first-pair将返回无结果; (ii) altova:find-first-pair的结果将始终是一个项对(数据类型不限)或不包含任何项。 •altova:find-first-pair(11 to 20, 21 to 30, function(\$a, \$b) {\$a+\$b = 32}) 返回以下序列:xs:integers (11, 21) •altova:find-first-pair(11 to 20, 21 to 30, function(\$a, \$b) {\$a+\$b = 33}) 返回无结果 请注意,上例中项对的顺序为:(11, 21) (12, 22) (13, 23)...(20, 30)。这就是为什么在第二个示例中会返回无结果(因为没有一个项对能相加得到33的总和)。 |
|
altova:find-first-pair-pos((Seq-01 as item()*), (Seq-02 as item()*), (Condition( Seq-01-Item, Seq-02-Item as xs:boolean)) as xs:integer XP3.1 XQ3.1 该函数取三个参数: •前两个参数Seq-01和Seq-02是包含一个或多个项(数据类型不限)的序列。 •第三个参数Condition是对一个XPath函数的引用,该函数取两个参数(arity为2)并返回一个布尔值。 Seq-01和Seq-02中的项将作为有序对传递,用作Condition中函数的参数。按如下所示生成有序对: If Seq-01 = X1, X2, X3 ...Xn And Seq-02 = Y1, Y2, Y3 ...Yn Then (X1 Y1), (X2 Y2), (X3 Y3) ...(Xn Yn) 使Condition函数评估为true()的第一个有序对的索引位置将作为altova:find-first-pair-pos的结果返回。请注意,如果Condition函数循环访问提交的参数对,并一次都没有评估为true(),则altova:find-first-pair-pos将返回无结果。 •altova:find-first-pair-pos(11 to 20, 21 to 30, function(\$a, \$b) {\$a+\$b = 32}) 返回1 •altova:find-first-pair-pos(11 to 20, 21 to 30, function(\$a, \$b) {\$a+\$b = 33}) 返回无结果 请注意,上例中项对的顺序为:(11, 21) (12, 22) (13, 23)...(20, 30)。在第一个示例中,第一对使得Condition函数评估为true(),因此返回了其在序列中的索引位置,即1。在第二个示例中,返回了无结果,因为没有一个项对能相加得到33的总和。 |
|
altova:find-first-pos((Sequence as item()*), (Condition( Sequence-Item as xs:boolean)) as xs:integer XP3.1 XQ3.1 该函数有两个参数。第一个参数是一个包含一个或多个项(数据类型不限)的序列。第二个参数Condition是对一个XPath函数的引用,该函数取一个参数(arity为1)并返回一个布尔值。Sequence中的每一项都会依次提交给在Condition中引用的函数。(请记住:该函数仅取一个参数。)使Condition中的函数评估为true()的第一个Sequence项在Sequence中的索引位置将作为altova:find-first-pos的结果返回,并且迭代停止。 •altova:find-first-pos(5 to 10, function(\$a) {\$a mod 2 = 0}) 返回xs:integer 2 Condition参数引用了XPath 3.0内联函数function(),它声明了一个名为\$a的内联函数,并对其进行定义。altova:find-first-pos 的Sequence参数中的每个项都依次传递给\$a作为其输入值。输入值将根据函数定义中的条件(\$a mod 2 = 0)进行测试。满足该条件的第一个输入值在序列中的索引位置将作为altova:find-first-pos的结果返回(在本例中为2,因为满足该条件的第一个值是6,它在序列中的索引位置为2)。 •altova:find-first-pos((2 to 10), (function(\$a) {\$a+3=7})) 返回xs:integer 3 更多示例如果C:\Temp\Customers.xml文件存在: •altova:find-first-pos( ("C:\Temp\Customers.xml", "https://www.altova.com/index.html"), (doc-available#1) ) 返回1 如果C:\Temp\Customers.xml文件不存在,但https://www.altova.com/index.html存在: •altova:find-first-pos( ("C:\Temp\Customers.xml", "https://www.altova.com/index.html"), (doc-available#1) ) 返回2 如果C:\Temp\Customers.xml文件不存在,并且https://www.altova.com/index.html也不存在: •altova:find-first-pos( ("C:\Temp\Customers.xml", "https://www.altova.com/index.html"), (doc-available#1) ) 返回无结果 有关上方示例的注意事项 •XPath 3.0函数doc-available取一个字符串参数,它被用作URI,如果在提交的URI中找到一个文档节点,则返回true。(因此,提交的URI处的文档必须是一个XML文档。) •doc-available函数可用于Condition,altova:find-first-pos的第二个参数,因为它仅取一个参数(arity=1), 需要取一个item()作为输入(一个用作URI的字符串),并返回一个布尔值。 •请注意,doc-available函数只是被引用,而不是被调用。附在它后面的#1后缀表示该函数的arity为1。总之,doc-available#1表示:使用具有arity=1的doc-availabe()函数,将第一个序列中的每一项依次作为其单一参数传递给它。因此,这两个字符串被传递给doc-available(),它使用字符串作为URI,并测试URI上是否存在一个文档节点。如果有,doc-available()函数将评估为true(),该字符串在序列中的索引位置将作为altova:find-first-pos函数的结果返回。有关doc-available()函数的注意事项:相对路径是相对于当前基URI解析的,默认情况下,基URI是加载该函数的XML文档的URI。 |
|
|
altova:for-each-attribute-pair(Seq1 as element()?, Seq2 as element()?, Function as function()) as item()* XP3.1 XQ3.1 前两个参数将标识两个元素,它们的特性将被用于生成一个特性对,其中一个特性将从第一个元素中获取,另一个特性将从第二个元素中获取。特性对是基于同名进行选择的,并且这些特性对将按(其名称的)字母顺序排列,形成一个集合。如果对于一个特性,在另一个元素上不存在对应的特性,则这一对则是“非连续的”,也就是它仅包含一个成员。函数项(第三个函数Function)将分别应用于特性对序列中的每一对(连续和非连续),并生成一个由项组成的序列。 •altova:for-each-attribute-pair(/Example/Test-A, /Example/Test-B, function(\$a, \$b){\$a+b}) 返回 ... (2, 4, 6) if <Test-A att1="1" att2="2" att3="3" /> <Test-B att1="1" att2="2" att3="3" /> (2, 4, 6) if <Test-A att2="2" att1="1" att3="3" /> <Test-B att3="3" att2="2" att1="1" /> (2, 6) if <Test-A att4="4" att1="1" att3="3" /> <Test-B att3="3" att2="2" att1="1" /> 提示:以下结果(2, 6)是通过以下操作获取的:(1+1, ()+2, 3+3, 4+())。如果其中一个操作数是空序列,则如上例中所示,加法的结果就是一个空序列。 •altova:for-each-attribute-pair(/Example/Test-A, /Example/Test-B, concat#2) returns ... (11, 22, 33) if <Test-A att1="1" att2="2" att3="3" /> <Test-B att1="1" att2="2" att3="3" /> (11, 2, 33, 4) if <Test-A att4="4" att1="1" att3="3" /> <Test-B att3="3" att2="2" att1="1" /> |
|
altova:for-each-combination(FirstSequence as item()*, SecondSequence as item()*, Function(\$i,\$j){\$i || \$j} ) as item()* XP3.1 XQ3.1 前两个参数中的两个序列中的项被合在一起,这样,第一个序列中的每一项就会按序与第二个序列中的每一项组合一次。作为第三个参数提供的参数将分别应用于生成的序列中的每个组合,并生成一个由项组成的序列(参见示例)。 •altova:for-each-combination( ('a', 'b', 'c'), ('1', '2', '3'), function(\$i, \$j){\$i || \$j} ) 返回('a1', 'a2', 'a3', 'b1', 'b2', 'b3', 'c1', 'c2', 'c3') |
|
altova:for-each-matching-attribute-pair(Seq1 as element()?, Seq2 as element()?, Function as function()) as item()* XP3.1 XQ3.1 前两个参数将标识两个元素,它们的特性将被用于生成一个特性对,其中一个特性将从第一个元素中获取,另一个特性将从第二个元素中获取。特性对是基于同名进行选择的,并且这些特性对将按(其名称的)字母顺序排列,形成一个集合。如果对于一个特性,在另一个元素上不存在对应的特性,则不会生成特性对。函数项(第三个函数Function)将分别应用于特性对序列中的每一对,并生成一个由项组成的序列。 •altova:for-each-matching-attribute-pair(/Example/Test-A, /Example/Test-B, function(\$a, \$b){\$a+b}) 返回 ... (2, 4, 6) if <Test-A att1="1" att2="2" att3="3" /> <Test-B att1="1" att2="2" att3="3" /> (2, 4, 6) if <Test-A att2="2" att1="1" att3="3" /> <Test-B att3="3" att2="2" att1="1" /> (2, 6) if <Test-A att4="4" att1="1" att3="3" /> <Test-B att3="3" att2="2" att3="1" /> •altova:for-each-matching-attribute-pair(/Example/Test-A, /Example/Test-B, concat#2) 返回 ... (11, 22, 33) if <Test-A att1="1" att2="2" att3="3" /> <Test-B att1="1" att2="2" att3="3" /> (11, 33) if <Test-A att4="4" att1="1" att3="3" /> <Test-B att3="3" att2="2" att1="1" /> |
|
altova:substitute-empty(FirstSequence as item()*, SecondSequence as item()) as item()* XP3.1 XQ3.1 如果FirstSequence为空,则返回SecondSequence。如果FirstSequence不为空,则返回FirstSequence。 •altova:substitute-empty( (1,2,3), (4,5,6) ) 返回(1,2,3) •altova:substitute-empty( (), (4,5,6) ) 返回(4,5,6) |
|