xsl 添加空space?

xsl adds empty space?

我有一个 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>

在最后的 Table 中 [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 检查它的原因。

感谢您的宝贵时间。

这是因为这里的这一行 select binding 元素

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

问题是您没有匹配 res:binding 或其任何后代的模板。这意味着 XSLT 将使用其内置模板,最终 select 所有后代文本节点。这包括用于缩进的 literal 元素前后的空白节点。可能正是这个空格给了你令人困惑的结果。

有多种方法可以解决。首先,您可以在 xsl:output 命令之后添加一个 xsl:strip-space 命令,告诉 XSLT 忽略仅包含空格的节点

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

或者,您可以更具体地 xsl:apply-templates 并直接定位 literal 元素。

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