将副本传递给函数?

时间:2011-07-01 07:52:30

标签: xml xslt

我需要选择以下节点的副本:

<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>,我可以安排我想要的段落。

我不知道是否有更容易的事情。

2 个答案:

答案 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(.),'&#xA;')"/>
    </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:2)

为什么函数需要节点的副本?为什么它不能用原作?

如果你确实需要这个,你可以在变量中复制并将变量传递给函数调用 - 但我发现很难理解为什么需要复制,除非它是带有副作用的扩展函数。

相关问题