XLST在转换为html后创建一个空白区域

时间:2015-05-29 11:52:30

标签: html xml xslt

我得不到它。

我的xml输入:

    <?xml version="1.0" encoding="UTF-8"?>
    <results>
    <error file="mixed.cpp" line="11" id="unreadVariable" severity="style"          msg="Variable 'wert' is assigned a value that is never used."/>
    <error file="mixed.cpp" line="13" id="unassignedVariable"         severity="style" msg="Variable 'b' is not assigned a value."/>
    <error file="mixed.cpp" line="11" id="arrayIndexOutOfBounds" severity="error" msg="Array 'wert[2]' accessed at index 3, which is out of bounds."/>
    <error file="mixed.cpp" line="15" id="uninitvar" severity="error" msg="Uninitialized variable: b"/>
    <error file="mixed.cpp" line="5" id="unusedFunction" severity="style" msg="The function 'func' is never used."/>
    <error file="*" line="0" id="unmatchedSuppression" severity="style" msg="Unmatched suppression: missingIncludeSystem"/>
    </results>

使用此xsl文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" omit-xml-declaration="yes"/>
  <xsl:template match="error">
    <tr>
      <td><xsl:value-of select="@file"/></td>
      <td><xsl:value-of select="@line"/></td>
      <td><xsl:value-of select="@test"/></td>
      <td><xsl:value-of select="@severity"/></td>
      <td><xsl:value-of select="@msg"/></td>
    </tr>
  </xsl:template>
</xsl:stylesheet>

但我得到的第一行是空的:

empty line
<tr><td>mixed.cpp</td><td>11</td><td/><td>style</td><td>Variable 'wert' is assigned a value that is never used.</td></tr>

空行从哪里来?

1 个答案:

答案 0 :(得分:2)

默认模板启用与您的error模板不匹配的模板,默认模板只输出文本。由于您有空白文本节点,而您没有匹配resultsresults内部(以及error之前和之后的空格)将成为输出的一部分。

有多种方法可以解决这个问题。一种典型的方法是编写一个低优先级模板,匹配您不想匹配的文本。即,如果添加以下内容,您的空格将消失:

<xsl:template match="text()" />

另一种方法是积极匹配您的结构。即,如果你要添加以下内容,空格也会消失,因为现在你匹配根元素,然后只对你感兴趣的元素应用模板(而不是results下的文本节点)。 / p>

<xsl:template match="results">
    <xsl:apply-templates select="error" />
</xsl:template>

第三种方法是添加空白剥离声明,但如果您的实际样式表更大并且依赖于其他地方的空白,这可能会影响输入XML。这只会删除results元素上的空格:

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

所有三个解决方案都有效,这取决于您的项目整体哪个最合适。

请记住,在XSLT 1.0和XSLT 2.0中,非匹配节点将与默认模板(不可见)匹配,并只输出该节点的文本值。在XSLT 3.0中,您可以更好地控制此过程:

<!-- XSLT 3.0 only -->
<xsl:mode on-no-match="shallow-skip" />