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

7

我能否将一个节点发送给XSLT函数?例如:

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

我能否将<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 ? 

看起来我在说函数时使用了 function 而不是 xsl:function,这给大家带来了很多困惑 :(


你是否在要求别人为你编写实际的代码?恐怕这样做效果不佳。 - Tomalak
鉴于问题描述中出现了“function”等术语,以及只需简单处理节点的要求,我认为@unknown对XSLT还比较陌生。提供一些使用books/book的示例代码可能会有所帮助,特别是对那些通过搜索找到这个问题的XSLT新手。 - b w
我正在寻找一个XSLT函数,它可以接受一个节点(基本上可以是任何节点)作为XSLT函数的参数。如果有的话,我可以得到这个XSLT函数的语法吗? - Laxmikanth Samudrala
你为什么要把原始问题作为评论粘贴在每个答案中? - ChaosPandion
5个回答

8
我认为你问题的答案是肯定的。你可以将一个节点发送给XSLT函数。
如果你想知道as=""属性的值应该用什么,你有几个选择。如果你想非常宽松并接受任何东西,使用as="item()*"来自David Pawson网站:

item()* .. 一种类似于节点集的东西?W3C

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

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

这会创建一个变量,你可以很容易地使用xpath进行黑客攻击。即记住item()。类型...一些例子。W3C。以下是Mike Kay在解释邮件中提供的示例:参数值可以是任何项(即节点或原子值)。但它必须是单个项。参数可以是单个项或空序列。参数必须是一个或多个项的序列-不允许为空序列。参数可以是零个或多个项的任何序列-这对其值没有任何限制。参数可以是任何零个或多个节点的序列。参数可以是任何零个或多个原子值(例如整数、字符串或布尔值)的序列。item()*是最通用的类型可能,它匹配所有东西,就像Java中的“Object”。出于这个原因,它通常可以省略。但并非总是如此,例如xsl:variable中的默认类型不是item()*,而是document-node(),以确保继续像XSLT 1.0一样行为。使用这些来指定参数、变量类型等。

1

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

concat(myelement, myelement/@myattribute)

虽然这个回答精确地回答了你提出的问题,但我愿打赌这并不是你想要的答案。但是,既然你已经问了四次,那么这里就是答案。 编辑 实际上,属性不是节点;只有元素、文本、注释、处理指令和 CDATA 部分才是节点。但上面的例子仍然正确地回答了问题。

0

XSL 不关心参数是什么。实际上它将所有内容都视为 XML。如果传入文本,则被视为文本节点。

以下示例包含一个链接,供参考。

http://www.w3schools.com/xsl/

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

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

我正在寻找一个XSLT函数,它接受一个节点(基本上可以是任何节点)作为XSLT函数的参数。如果有的话,我可以得到这个XSLT函数的语法吗? - Laxmikanth Samudrala

-1

除了ChaosPandion的回答,您可能需要在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属性的值。

不确定这句话的意思,但是你的XPath在语义上与ChaosPandion的答案不同。 - Pavel Minaev
看起来我的问题不太清楚,我可以有一个接受节点作为参数的函数吗?如果可以,能否给出示例代码语法? - Laxmikanth Samudrala
Pavel,我知道.InnerXml和.OuterXml是不同的——/MyNode/node()和/MyNode也是不同的。 - rasx
我正在寻找一个XSLT函数,它接受一个节点(基本上可以是任何节点)作为XSLT函数的参数。如果有的话,我可以得到这个XSLT函数的语法吗? - Laxmikanth Samudrala

-1
在你的问题中:

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

并且后来评论:

我可以有一个接受节点作为参数的函数吗?

...你正在寻求一个函数,但是我认为你想要的是一个 模板 用于 book 元素
当然,你可以用多种方式来实现这个目标——使用for-each循环,在模板中使用with-parambook节点实际发送到模板中等等。但是一个简单的template应该就能够实现你所需的功能。无论模板匹配什么都是“参数”。
<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>

如果您想对子元素(作者、价格和年份)进行一些进一步的处理,您可以考虑为它们创建模板。请记住,匹配“年”将匹配所有年份元素,甚至包括出生日期等。 (在这些情况下,您可能希望限制匹配中的 XPath 或仅在书籍模板内保留book/year 处理。)例如,您想要对year做一些额外的处理。您的书籍处理可能会发展成以下形式(其中您现在将每个year节点作为参数传递到年份模板中):

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

我正在寻找一个XSLT函数,它接受一个节点(基本上可以是任何节点)作为XSLT函数的参数。如果有的话,我可以得到这个XSLT函数的语法吗? - Laxmikanth Samudrala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接