如何使用xsl:copy-of复制XML节点的文本并传递给表单?使用CDATA代替?

时间:2013-11-16 21:18:45

标签: javascript jquery xml xslt cdata

我正在尝试使用<xsl:copy-of>提交两个XML节点的副本以及表单。问题是我只获取节点的文本内容而不是所有的完整节点内容。根据{{​​3}}:

  

<xsl:copy-of>元素创建当前节点的副本。   注意:名称空间节点,子节点和当前节点的属性   也会自动复制!

但是,这似乎并没有发生在我身上 - 要么我不理解这个音符,要么我错误地使用<xsl:copy-of>元素。我在下面包含了我的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看起来像这样:

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

当我将它添加到XSL时:

<xsl:copy-of select="current()/trigger"></xsl:copy-of>
<xsl:copy-of select="current()/ggps"></xsl:copy-of>

我得到这个HTML:

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

我正在使用jQuery来提交表单:

$(".button").click(function() {
    var trigger = $(this).parent().siblings("input.trigger").val();
    var ggps = $(this).parent().siblings("input.ggps").val();
    var dataString = 'trigger=' + trigger + '&ggps=' + ggps;    

    $.ajax({
        type : "POST",
        url : "/submit_label",
        data : dataString,
        success : function(){
            console.log("dataString:\n" + dataString);
        }
    });
    return false;
});

我从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>'

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

1 个答案:

答案 0 :(得分:3)

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

value="{$trigger}"

将值展平为字符串 - 特别是根元素的字符串值,即其后代文本节点的串联。

如果您希望该属性包含树的序列化版本(即,包含标记的词法XML,可能是为了使其成为合法的属性值而被转义),那么您需要调用某种serialize-xml()函数。在XSLT 3.0和Saxon等一些产品中有这样的功能;或者你可以写自己的。