【问题标题】:How to use xsl:copy-of to copy text of XML node and pass to form? Use CDATA instead?如何使用 xsl:copy-of 复制 XML 节点的文本并传递给表单?改用 CDATA?
【发布时间】:2013-11-16 21:18:44
【问题描述】:

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

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

但是,这似乎并没有发生在我身上——要么我不理解注释,要么我错误地使用了<xsl:copy-of> 元素。我在下面包含了我的 xml、xsl 和 jQuery 的 sn-ps(我将 xsl 应用于 xml,它创建了一个使用 jQuery 提交的 html 表单)。我还包括了我目前正在处理的输出以及所需的输出。任何建议都非常感谢!

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 文档中。

【问题讨论】:

  • 我不清楚您实际应用 XSLT 的方式和时间,以及这里到底发生了什么,但您似乎正在调用 .val() 来获取表单输入的值,当你真正想要的是某种整体元素时?或者可能 的值,但由于 XML 和 HTML 具有共享语法,存在一些转义问题?
  • 我的想法是让 input.trigger 的值等于'&lt;xml code&gt;'。但是,是的,我认为这个问题与字符转义问题有关。
  • 使用xsl:copy-of 然后尝试将其粘贴到属性中只会为您提供文本值。您是否尝试过只运行 XSLT 来查看生成的 HTML 的样子?
  • 对,我只获取form属性的属性文本值。尽管&lt;xsl:copy-of&gt; 放在文件中的其他位置时会给出正确的输出(请参阅上面添加的评论)。

标签: javascript jquery xml xslt cdata


【解决方案1】:

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

value="{$trigger}"

该值被展平为一个字符串 - 具体来说,根元素的字符串值,它是其后代文本节点的串联。

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

【讨论】:

  • 谢谢。我不熟悉 xml 序列化,但这听起来像我需要的。我是新手,所以我不确定如何判断我是否使用 XSLT 3.0。此外,如果您可以向我指出 XSLT 3.0 中 serialize-xml() 函数的一些文档,那将会很有帮助。在 Google 的快速搜索中没有发现任何明显的结果。
  • 我认为你应该看看stackoverflow.com/questions/6696382。 @FrançoisDispaux 的答案包含一个序列化程序,它可能能够处理一个复杂的节点集的序列化,如您的示例所示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
  • 2011-04-28
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
相关资源
最近更新 更多