我需要选择以下节点的副本:
<xsl:copy-of select="node1/node2/*" />
我需要将此副本的值传递给函数ProcessNodes,该函数接收字符串作为输入参数并返回一个字符串以进行某些处理,并将结果写为:
<Data>
Result of the function
</Data>
我以为我可以把
<Data>
<xsl:copy-of select="myfunction:ProcessNodes(node1/node2/*)" />
</Data>
但这是不正确的。
我可以知道这样做的正确语法吗?
PS :实际上该文档是XML,类似于:
<Node1>
<Node2>
<html>
<body>
<p>My first paragraph.</p>
<p>My 2nd paragraph. And this paragrah
has 2 lines.</p>
</body>
</html>
</Node2>
</Node1>
我需要把它们写成
<Data>
My first paragraph.
My 2nd paragraph. And this paragrah has 2 lines.
</Data>
请注意,第2段中的2行合并为1行。
这就是为什么我需要副本,以便可以保留标签<p>
,我可以安排我想要的段落。
我不知道是否有更容易的事情。
答案 0 :(得分:2)
不要传递节点序列。只需传递父元素,然后在函数范围内使用它来获取子元素。
<xsl:value-of select="myfunction:ProcessNodes(node1/node2)" />
添加“PS”后,你的意图仍然不清楚(至少对我来说)。您可以在没有任何cutom功能的情况下实现您想要的结果。例如:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*/*/*/*">
<Data>
<xsl:apply-templates select="p"/>
</Data>
</xsl:template>
<xsl:template match="p">
<xsl:value-of select="concat(normalize-space(.),'
')"/>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:2)
为什么函数需要节点的副本?为什么它不能用原作?
如果你确实需要这个,你可以在变量中复制并将变量传递给函数调用 - 但我发现很难理解为什么需要复制,除非它是带有副作用的扩展函数。