如何将节点(any)发送到xsl:function?

Lax*_*ala 6 xml xslt

我可以将节点发送到XSLT函数吗?例如:

<books>
  <book>
    <author>a1</author>
    <price>10</price>
    <year>2009</year>
  </book>
  <!-- ... -->
</books>
Run Code Online (Sandbox Code Playgroud)

我可以将<book>元素发送到函数 - 在该函数中我想处理book(<author>,<price><year>)下的节点

我可以创建一个xsl:function如下所示?

 <xsl:function name="util:checkNode" as="xs:boolean">
      <!-- I would like to know xml schema data type for the param -->
       <xsl:param name="nodeP" as="****"/>
  </xsl:function


          If yes, what xsl schema type to the param ? 
Run Code Online (Sandbox Code Playgroud)

看起来我通过说函数而不是xsl来创建很多混乱:函数---- :(

Mad*_*sen 8

我想你的问题的答案是肯定的.您可以将节点发送到XSLT函数.

如果您想知道如何使用as =""属性的值,您有几个选择.如果你想要非常宽松并接受任何事情,请使用as ="item()*".

来自David Pawson的网站:

item()*..类型的节点集?W3C

是的,我同意它看起来毫无意义.然而.从CR开始,它非常重要,特别是如果你想使用类型.并且想要在变量中生成一个节点集..抱歉序列.

<xsl:variable name="a"
 select="(//h3)[position() < 3]"
 as="item()*"/>
Run Code Online (Sandbox Code Playgroud)

这样就可以很容易地使用xpath创建一个变量.即记住item()*.

类型......一些例子.W3C

来自Mike Kay的解释性电子邮件,谢谢Mike.例子:

<xsl:param name="x" as="item()"/>

参数值可以是任何项(即节点或原子值).但它必须是单一项目.

<xsl:param name="x" as="item()?"/>

参数可以是单个项目,也可以是空序列

<xsl:param name="x" as="item()+"/>

参数必须是一个或多个项的序列 - 不允许空序列

<xsl:param name="x" as="item()*"/>

参数可以是零个或多个项目的任何序列 - 这对其值没有任何限制.

<xsl:param name="x" as="node()*"/>

参数可以是零个或多个节点的任何序列

<xsl:param name="x" as="xs:atomicValue*"/>

参数可以是零个或多个原子值的任何序列(例如整数,字符串或布尔值).

item()*是最常用的类型,它匹配所有内容,例如Java中的"Object".因此,通常可以省略.但并非总是如此,例如xsl:variable中的默认类型不是item()*而是document-node(),以确保

<xsl:variable name="rtf"><a>thing</a> </xsl:variable>

继续表现得像XSLT 1.0

使用这些来指定参数,变量类型等.