2

在过去的几个小时里,我一直试图弄清楚这一点,但我无法理解它,所以我有以下功能:

$("SPEECH",currentContext).each(function(){
        var speaker = $("#selectSpeaker").val();
        if($(this).find("SPEAKER").text()===speaker){
            var line = $(this).find("LINE").text();

            $("#speakers").append("<p class='speech'>" + speaker + "</p>" + "<p>" + line + "</p>");
        } 
    });

和 XML 标记为:http: //pastebin.com/GhesMcay

我正在做的是通过 XML 提取诸如LINE&之类的信息SPEECH,它工作得几乎完美,它找到了 selected SPEAKER,找到了LINE与扬声器关联的 ' 并输出它们。但是,我发现LINEXML 中连续的任何 ' 都被放置到 1 个长段落中,而不是每个的新段落中(就像我想要的那样)。通过这样做,对于连续的行,在一行的结尾和下一行的开头之间没有空格,因此行的开头和结尾单词被连接在一起。

据我所知,我可以说这归结为不寻找每一行,所以我的想法是.each()在变量中使用可以解决这个问题,但是我似乎无法让它工作。

任何帮助将不胜感激!

提前致谢。

4

2 回答 2

5

你所说的基本正确。如果$(this).find("LINE")返回多个项目,那么当您调用时text(),文本将被连接在一起。如果您想单独对每个人做某事,您可以使用each

var lines = $(this).find("LINE");

lines.each(function(){
   var singleLine = $(this);

   // do something here
});

编辑:另一种选择是使用map

var lines = $(this).find("LINE").map(function(){
    return "<p>" + $(this).text() + "</p>";
}).get().join("");

$("#speakers").append("<p class='speech'>" + speaker + "</p>" + lines);
于 2012-05-02T03:41:16.587 回答
0

.find(...) 可能会返回一个项目数组。你应该映射它们:

$("SPEECH",currentContext).each(function(){
    var speaker = $("#selectSpeaker").val();
    if($(this).find("SPEAKER").text()===speaker){

        // treat this like an array, and return a new paragraph for each line:
        var lines = $.makeArray(
            $(this).find("LINE").map(function() { return "<p>" + $(this).text() + "</p>"; })
        );

        $("#speakers").append("<p class='speech'>" + speaker + "</p>" + lines.join(""));
    } 
});

编辑:忘记了 .map() 是具有返回值的那个......然后你必须调用 .makeArray。:( 不幸的是没有那么简单。

于 2012-05-02T03:43:24.063 回答