我正在尝试使用xslt显示xml文件。在某些节点中,我有<code>
标记之间的数据。我不希望显示代码标记。
所以如何使用xslt单独删除<code>
和</code>
标记。
我尝试了translate(),但它将模式视为单独的字符,因此所有c,o,d,e也都从xml内容中删除。
这是一个示例xml数据:
<results>
<result>
<resultType>Error</resultType>
<lineNum>3</lineNum>
<columnNum>1</columnNum>
<errorMsg><code>script</code> may cause screen flicker.<</errorMsg>
</result>
<result>
<resultType>Potential Problem</resultType>
<lineNum>6</lineNum>
<columnNum>2</columnNum>
<errorMsg><code>script</code> user interface may not be accessible.<
</errorMsg>
</result>
</results>
我的xslt:
<table>
<tr class="header">
<th>Serial Number</th>
<th>Line Number</th>
<th>Error Message</th>
<th>Decision Pass</th>
</tr>
<xsl:for-each select="results/result">
<xsl:if test="resultType='Potential Problem'">
<xsl:variable name="eMsg" select="errorMsg"></xsl:variable>
<tr class="content">
<td><xsl:number format="1"/></td>
<td><xsl:value-of select="lineNum"/></td>
<td><xsl:value-of select="errorMsg" disable-output-escaping="yes"/></td>
</tr>
</xsl:if>
</xsl:for-each>
</table>
disable-output-escaping =“yes”不适用于Firefox,因此尝试删除<code>
,</code>
代码
答案 0 :(得分:1)
如果你想摆脱一个实际的XML元素,你可以使用这样的东西:
<xsl:template match="code">
<xsl:apply-templates/>
</xsl:template>
(假设您有一个复制其他所有内容的身份模板:
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates/></xsl:copy>
</xsl:template>
)
然而,看起来你所拥有的实际上是你要删除的文本。在这种情况下,xsl:analyze-string可能就是您所需要的:
<xsl:template match="errorMsg/text()">
<xsl:analyze-string select="." regex="&lt;code$amp;gt;(.*)&lt;/code$amp;gt;">
<xsl:matching-substring><xsl:value-of select="regex-group(1)"/></xsl:matching-substring>
<xsl:non-matching-substring><xsl:value-of select="."/></xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
其他一些提示和意见:如果你在使用模板时使用for-each,你应该考虑后者。禁用 - 输出 - 转义是魔鬼,应该在99%的时间(或更多)避免使用。
希望能做到!