Xml 如何将节点(任意)发送到xsl:function?

Xml 如何将节点(任意)发送到xsl:function?,xml,xslt,Xml,Xslt,我可以向XSLT函数发送节点吗?例如: <books> <book> <author>a1</author> <price>10</price> <year>2009</year> </book> <!-- ... --> </books> a1 10 2009 我可以将元素发送到函数吗?在该函数中,我希望处理book(、或

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

<books>
  <book>
    <author>a1</author>
    <price>10</price>
    <year>2009</year>
  </book>
  <!-- ... -->
</books>

a1
10
2009
我可以将
元素发送到函数吗?在该函数中,我希望处理book(
下的节点)

我可以创建如下xsl:函数吗

 <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 ? 


XSL不关心参数是什么。它真的把一切都当作XML。如果传入文本,则将其视为文本节点

下面是一个带有链接的示例,以供进一步参考


要添加到答案中,您可能需要在XPath查询中添加一个:

<xsl:call-template name="TemplateName">
    <xsl:with-param name="ParamName" select="MyNode/MyNode/node()" />
</xsl:call-template>

<xsl:template name="TemplateName">
    <xsl:param name="ParamName" />
</xsl:template>

正式而言,
node()
不是一个函数,它是一个测试,但可以返回一个类似于
XmlNode.InnerXml
属性的值。

在您的问题中:

我可以将元素发送到函数吗?在该函数中,我希望处理book下的节点(对于
book
元素)

当然,您可以通过多种方式来实现这一点——在一个循环中,实际使用等将
book
节点发送到模板中——但一个简单的方法应该可以实现您所需要的功能。模板匹配的任何内容都是“参数”


有很多XSLT函数接受节点作为参数。例如,
concat
的所有参数都可以是节点,例如:

concat(myelement, myelement/@myattribute)
虽然这正好回答了你提出的问题,但我敢打赌,这不是你想要回答的问题。但是,见鬼,你问了四次,就这样吧

编辑


实际上,属性不是节点;只有元素、文本、注释、处理指令和CDATA部分是节点。但是上面的示例仍然正确地回答了这个问题。

我认为您的问题的答案是,是的。可以将节点发送到XSLT函数

如果您想知道as=”“属性的值使用什么,您有几个选择。如果您想非常宽松,接受任何东西,请使用as=“item()*”

:

item()*…节点集的排序?W3C

是的,我同意它看起来很漂亮 毫无意义,不是吗。然而,从 CR,它非常重要,尤其是 如果您想要使用类型。并且想要 比如说,生成一个节点集..对不起 序列,在变量中


这将创建一个可以破解的变量 非常容易地使用xpath。 记住item()*

类型…一些示例。W3C

来自迈克的一封解释性电子邮件 凯,谢谢你,迈克。例子:

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

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

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

该参数可以是以下任意序列: 零个或多个项目-此项不放置 对其价值的限制

该参数可以是以下任意序列: 零个或多个节点

该参数可以是以下任意序列: 零个或多个原子值(例如。 整数、字符串或布尔值)

item()*是最通用的类型 可能,它匹配所有东西,比如 Java中的“对象”。因此 通常可以省略,但不能省略 始终,例如默认类型 在xsl中:变量不是item()*而是 document-node(),以确保

东西

继续像XSLT1.0一样工作

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


不确定这是什么意思,但您的XPath在语义上与ChaosPandion的答案不同。看起来我的问题不清楚,我能不能有一个接受节点作为参数的函数?如果可以,我能有一个示例代码语法吗?Pavel,我知道.InnerXml不同于.OuterXml---还有那/MyNode/node()与/MyNode不同。我正在寻找一个XSLT函数,它接受一个节点(基本上是任何节点)作为XSLT函数的参数?如果是,我可以知道XSLT函数的语法吗?你是否要求人们为你编写实际的代码?这恐怕不会很好地工作,考虑到问题的措辞(“函数”,等等)为了简单地处理这个节点,我认为@unknown对xslt来说是一个新概念。使用books/book的一些示例代码可能会有所帮助,特别是对于在搜索中发现这个问题的其他xslt新手来说。我正在寻找一个xslt函数,它接受一个节点(基本上是任何节点)作为XSLT函数的参数?如果是,我可以得到XSLT函数的语法吗?为什么要将原始问题粘贴到每个答案中作为注释?我正在寻找一个XSLT函数,它接受一个节点(基本上是任何节点)作为XSLT函数的参数?如果是,我可以得到XSLT函数的语法吗?我正在寻找一个XSLT函数,它接受一个节点(基本上是任何节点)作为XSLT函数的参数?如果是,我可以得到XSLT函数的语法吗?
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="books">
  <xsl:apply-templates select="book"/>
</xsl:template>

<xsl:template match="book">
    author: <xsl:value-of select="author" />
    price: <xsl:value-of select="price" />
    year: <xsl:value-of select="year" />
</xsl:template>

</xsl:stylesheet>
<xsl:template match="book">
    author: <xsl:value-of select="author" />
    price: <xsl:value-of select="price" />
    <xsl:apply-templates select="year" />
</xsl:template>

<xsl:template match="year">
   <xsl:choose>
      <xsl:when test="year &lt; '2000'">
         from a prior century: <xsl:value-of select="." />
      </xsl:when>
      <xsl:otherwise>
         from this century: <xsl:value-of select="." />
      </xsl:otherwise>
   </xsl:choose>
</xsl:template>
concat(myelement, myelement/@myattribute)
<xsl:variable name="a"
 select="(//h3)[position() < 3]"
 as="item()*"/>