2016-09-13 3 views
1

У меня есть sparql-results XML-файл. Я получаю это от RD4J-Rest API. Когда я открываю файл в Notepad ++, он, как и ожидалось: (образец)xsl добавляет пустое пространство?

<result> 
     <binding name='ilAbk'> 
      <literal>[A_2mim]Ll</literal> 
     </binding> 
</result> 

Теперь я использую шаблон XSL для форматирования вывода:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:res="http://www.w3.org/2005/sparql-results#"> 
<xsl:output method="xml" encoding="UTF-8" /> 

<xsl:template name="vb-result"> 
    <table id="main"> 
    <xsl:for-each select="res:results/res:result"> 
     <tr id="{generate-id()}"> 
     <xsl:apply-templates select="."/> 
     </tr> 
    </xsl:for-each> 
    </table> 
</xsl:template> 

<xsl:template match="res:result"> 
    <xsl:variable name="current" select="."/> 
    <xsl:for-each select="/res:sparql/res:head/res:variable"> 
    <xsl:variable name="name" select="@name"/> 
    <td> 
     <xsl:apply-templates select="$current/res:binding[@name=$name]"/> 
    </td> 
    </xsl:for-each> 
</xsl:template> 

<xsl:template match="res:sparql"> 
    <xsl:call-template name="vb-result" /> 
</xsl:template> 

</xsl:stylesheet> 

В итоговой таблице [A_2mim]Ll имеет одинаковые символы count (9). Но когда я обращаюсь к нему с помощью JavaScript и отображаю его в консоли, он получает десять дополнительных пустых символов. Вот JavaScript часть:

function addRowHandlers() { 
    var table = document.getElementById("main"); 
    var rows = table.getElementsByTagName("tr"); 
    for (i = 0; i < rows.length; i++) { 
     var currentRow = table.rows[i]; 
     var createClickHandler = 
     function(row) 
     { 
      return function() { 
       var cell = row.getElementsByTagName("td")[0]; 
       var text = cell.innerHTML; 
       var rid = row.getAttribute("id"); 
       console.log(text.length); 
      }; 
     }; 

    currentRow.onclick = createClickHandler(currentRow); 
    } 
} 

Потому что я хотел бы использовать это имя для следующего запроса, мне нужно, чтобы избавиться от этих символов. Я знаю, что я мог бы это отрезать, но мне было интересно, есть ли у кого-нибудь идея, откуда эти персонажи. Это выглядит странно в консоли - вот почему я проверил его с помощью .length.

Спасибо за ваше время.

+1

'' 9 символов, вы хотите '.textContent' вместо' .innerHTML'? – dandavis

+0

Извините, что внесла ошибку в вопрос. Я получаю десять дополнительных пустых мест. Но я попробовал ваш вход. Я изменил _cell.innerHTML_ на _cell.textContent_, но у меня все еще есть 19 символов. – MisterT

ответ

0

Именно из-за этой линии здесь, где выбратьОбновление binding элемент

<xsl:apply-templates select="$current/res:binding[@name=$name]"/> 

Этот вопрос не имеет шаблон, соответствующий res:binding или любой из его потомков. Это означает, что XSLT будет использовать встроенные шаблоны, которые в конечном итоге будут выбирать все последующие текстовые узлы. Сюда относятся узлы пробелов, до и после элемента literal, который используется для отступов. Именно этот пробел, вероятно, дал вам ваши запутанные результаты.

Существует несколько способов решить эту проблему. Во-первых, вы можете добавить команду xsl:strip-space после команды xsl:output, чтобы сказать XSLT игнорировать пробелы только узлы

<xsl:strip-space elements="*" /> 

В качестве альтернативы, вы можете быть более конкретным с вами xsl:apply-templates и целевой literal элемент непосредственно.

<xsl:apply-templates select="$current/res:binding[@name=$name]/res:literal"/> 
+0

Спасибо @Tim C, оба примера для решения работают очень приятно. А также спасибо за объяснение. – MisterT

Смежные вопросы