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

问题描述:

我不明白。XLST在转换为html后创建一个空白空间

我的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> 

哪里是空行来?

+2

在xsl:output之前添加''。测试看看。 –

+0

你是最好的;)谢谢 –

+0

在你的结构中,还应该在每个匹配的'error'之间有一个尾部空行和一个空行。一旦删除了空格,'

'不会再以新行开始,除非在'xsl:output'上添加'indent =“yes”'。另外,如果您的目标是HTML,请使用'method =“html”'。它会处理(非)自动关闭元素,否则浏览器会窒息。即'

'vs'

'和''vs''。 – Abel

回答

模板的默认模板不匹配您的error模板,默认模板只输出文本。由于您有空白文本节点,并且您不匹配results,因此results(以及之前和之后的error)中的空白将成为输出的一部分。

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

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

另一种方法是正确地匹配您的结构。即,如果添加以下内容,则空白字符也会消失,因为现在您匹配根元素,随后仅对您感兴趣的元素(而不是results下的文本节点)应用模板。

<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" /> 

模板的默认模板不匹配您的error模板,默认模板只输出文本。由于您有空白文本节点,并且您不匹配results,因此results(以及之前和之后的error)中的空白将成为输出的一部分。

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

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

另一种方法是正确地匹配您的结构。即,如果添加以下内容,则空白字符也会消失,因为现在您匹配根元素,随后仅对您感兴趣的元素(而不是results下的文本节点)应用模板。

<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" /> 

模板的默认模板不匹配您的error模板,默认模板只输出文本。由于您有空白文本节点,并且您不匹配results,因此results(以及之前和之后的error)中的空白将成为输出的一部分。

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

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

另一种方法是正确地匹配您的结构。即,如果添加以下内容,则空白字符也会消失,因为现在您匹配根元素,随后仅对您感兴趣的元素(而不是results下的文本节点)应用模板。

<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" />