Javascript 如何使用xsl:copy of复制XML节点的文本并传递到表单?是否改用CDATA?

Javascript 如何使用xsl:copy of复制XML节点的文本并传递到表单?是否改用CDATA?,javascript,jquery,xml,xslt,cdata,Javascript,Jquery,Xml,Xslt,Cdata,我试图使用提交两个XML节点的副本以及一个表单。问题是我只获取节点的文本内容,而不是所有完整的节点内容。根据: 元素创建当前节点的副本。 注意:名称空间节点、子节点和当前节点的属性 也会自动复制 但是,这似乎没有发生在我身上——要么我不理解注释,要么我错误地使用了元素。我在下面包含了xml、xsl和jQuery的片段(我将xsl应用于xml,它创建了一个html表单,使用jQuery提交)。我还包括了我目前正在处理的输出和期望的输出。任何建议都将不胜感激 XML如下所示: <trigger

我试图使用
提交两个XML节点的副本以及一个表单。问题是我只获取节点的文本内容,而不是所有完整的节点内容。根据:

元素创建当前节点的副本。 注意:名称空间节点、子节点和当前节点的属性 也会自动复制

但是,这似乎没有发生在我身上——要么我不理解注释,要么我错误地使用了
元素。我在下面包含了xml、xsl和jQuery的片段(我将xsl应用于xml,它创建了一个html表单,使用jQuery提交)。我还包括了我目前正在处理的输出和期望的输出。任何建议都将不胜感激

XML如下所示:

<trigger offsetBeg="89" offsetEnd="96">induced</trigger>
<ggps>
    <ggp role="Theme" offsetBeg="68" offsetEnd="73" id="10013" 
     consensusName="HDAC6">HDAC6</ggp>
    <ggp role="Cause" offsetBeg="100" offsetEnd="103" id="7001" 
     consensusName="TSA">TSA</ggp>
</ggps>
<xsl:variable name="trigger"><xsl:copy-of select="trigger" /></xsl:variable>
<xsl:variable name="ggps"><xsl:copy-of select="ggps" /></xsl:variable>
<form name="label_form" action="">
    <input class="trigger" type="hidden" name="trigger" value="{$trigger}" />
    <input class="ggps" type="hidden" name="ggps" value="{$ggps}" />
    <div><button class="button">Submit</button></div>
</form>
value="{$trigger}"
我从console.log中得到的是:

dataString:
trigger='induced   '&ggps='  HDAC6  TSA    '
我想从console.log获得以下内容:

dataString:
trigger='<trigger offsetBeg="89" offsetEnd="96">induced</trigger>'&ggps='<ggps>
<ggp role="Theme" offsetBeg="68" offsetEnd="73"id="10013"consensusName="HDAC6">
HDAC6</ggp><ggp role="Cause" offsetBeg="100" offsetEnd="103" id="7001" 
consensusName="TSA">TSA</ggp></ggps>'
dataString:
trigger='induced'&ggps='1
HDAC6TSA'

我希望这样,因为我希望能够将这些节点直接放到我将要构建的另一个XML文档中

变量$trigger包含相关树的完整副本,但当您使用如下属性值模板时:

<trigger offsetBeg="89" offsetEnd="96">induced</trigger>
<ggps>
    <ggp role="Theme" offsetBeg="68" offsetEnd="73" id="10013" 
     consensusName="HDAC6">HDAC6</ggp>
    <ggp role="Cause" offsetBeg="100" offsetEnd="103" id="7001" 
     consensusName="TSA">TSA</ggp>
</ggps>
<xsl:variable name="trigger"><xsl:copy-of select="trigger" /></xsl:variable>
<xsl:variable name="ggps"><xsl:copy-of select="ggps" /></xsl:variable>
<form name="label_form" action="">
    <input class="trigger" type="hidden" name="trigger" value="{$trigger}" />
    <input class="ggps" type="hidden" name="ggps" value="{$ggps}" />
    <div><button class="button">Submit</button></div>
</form>
value="{$trigger}"
该值被展平为一个字符串—具体地说,是根元素的字符串值,它是其后代文本节点的串联


如果希望属性包含树的序列化版本(即,包含标记的词法XML,可能是为了使其成为合法属性值而转义的),则需要调用某种serialize-XML()函数。XSLT3.0和一些产品(如Saxon)中都有这样的函数;或者您也可以自己编写。

我不清楚您是如何以及何时实际应用XSLT的,以及这里到底发生了什么,但您似乎在调用
.val()
来获取表单输入的值,而您实际需要的是某种类型的整个元素?或者这就是值,但由于XML和HTML具有共享语法,因此存在一些转义问题?我的想法是使input.trigger的值等于“
”。但是,是的,我认为问题与字符转义问题有关。使用
xsl:copy of
然后尝试将其粘贴到属性中只会得到文本值。您是否尝试只运行XSLT来查看生成的HTML是什么样子的?对,我只获取表单属性的属性文本值。尽管
在文件中的其他位置提供了正确的输出(请参见上面添加的注释)。谢谢。我不熟悉xml序列化,但这听起来像是我需要的。我对这方面还不熟悉,所以我不知道如何判断我是否在使用XSLT 3.0。另外,如果您能向我介绍XSLT 3.0中serialize-xml()函数的一些文档,那将非常有用。在快速的谷歌搜索中没有发现任何明显的东西。我想你应该看看。@FrançoisDispaux的答案包含一个序列化程序,该序列化程序可以处理复杂节点集的序列化,如示例所示。