2016-09-13 2 views
1

sparql-results XML 파일이 있습니다. 나는 RD4J-Rest API에서 가져옵니다. 내가 메모장 ++에서 파일을 열 때 예상대로 : (샘플) 이제xsl이 빈 공간을 추가합니까?

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

I 출력 포맷하는 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로 액세스하여 콘솔에 표시하면 10 개의 빈 문자가 추가로 생깁니다. 다음은 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

''대신 .innerHTML''의 .textContent'는'할까요, 9 개 문자인가? – dandavis

+0

죄송합니다. 질문에 실수했습니다. 나는 10 개의 추가 공백을 얻는다. 그러나 나는 당신의 의견을 시도했다. _cell.innerHTML_을 _cell.textContent_으로 변경했지만 여전히 19자를 가지고 있습니다. – MisterT

답변

0

이 문제는 당신이 res:binding 또는 그 자손과 일치하는 템플릿을하지 않아도되는 binding 요소를

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

을 선택하는 곳이 여기에 있기 때문에이 라인이다. 즉, XSLT는 궁극적으로 모든 자손 텍스트 노드를 선택하는 내장 템플릿을 사용합니다. 여기에는 들여 쓰기에 사용되는 literal 요소 앞뒤의 공백 노드가 포함됩니다. 이 공백은 아마도 당신에게 혼란스러운 결과를 줄 것입니다.

해결 방법에는 여러 가지가 있습니다. 첫째, 당신은 공백 무시 XSLT에게의 xsl:output 명령 후 xsl:strip-space 명령을 추가 할 수 있습니다 만하면 xsl:apply-templates 더 구체적으로 직접 literal 요소를 타겟팅 할 수 있습니다, 또는

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

노드.

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

감사합니다. @Tim C 해결 방법에 대한 두 가지 예가 매우 좋습니다. 그리고 설명해 주셔서 감사합니다. – MisterT

관련 문제