我有一个 sparql-results XML文件。我是从 RD4J-Rest API获得的。当我在 Notepad ++ 中打开文件时,它是预期的:(示例)
<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
具有相同的字符数(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
检查它的原因。
感谢您的时间。
答案 0 :(得分: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"/>