我正在尝试使用<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文档中。
答案 0 :(得分:3)
您的变量$ trigger包含相关树的完整副本,但是当您使用这样的属性值模板时:
value="{$trigger}"
将值展平为字符串 - 特别是根元素的字符串值,即其后代文本节点的串联。
如果您希望该属性包含树的序列化版本(即,包含标记的词法XML,可能是为了使其成为合法的属性值而被转义),那么您需要调用某种serialize-xml()函数。在XSLT 3.0和Saxon等一些产品中有这样的功能;或者你可以写自己的。