2016-09-13 12 views
1

私はsparql-results XMLファイルを持っています。私はRD4J-Rest APIから入手します。私はメモ帳++でファイルを開くと、予想通り、それは次のとおりです(サンプル)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でアクセスしてコンソールに表示すると、空の文字が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

'' 9つの文字で、あなたは.textContent'代わり.innerHTML' 'の'したいですか? – 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

関連する問題