我得不到它。
我的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>
空行从哪里来?
答案 0 :(得分:2)
默认模板启用与您的error
模板不匹配的模板,默认模板只输出文本。由于您有空白文本节点,而您没有匹配results
,results
内部(以及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" />