2010-02-15 31 views
0

您好我通常使用C++进行编程,所以XML/XSL/XPATH不是我的强项,但我需要做一个转换,我似乎无法找到一个好的这样做的方式。使用xsl匹配xml元素的数据部分内部的表达式

我们有一个此格式的XML文件:

<outer> 
    <element/> 
    <other_element/> 
    <message pri="info"> 
    [[!CDATA Error: something is not working]] 
    </message> 
    <message pri="info"> 
    [[!CDATA Warning: warnings are boring]] 
    </message> 
</outer> 

我需要一个XSL,可以改变这个完全相同的xml文件,不同之处,在于它的匹配“错误:”部分,并将pri属性更改为“error”。

我需要使用xsl转换器来做到这一点,我已经开始研究XPATH,但是我很难找到如何完成这个任务。

我得到尽可能的消息与

<xsl:template match="message"> 
    <xsl:choice> 
    <xsl:when test="tricky part"> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:justcopythetag> 
    </xsl:otherwise> 
    </xsl:choice> 
</xsl:template> 

匹配我已经找到了如何复制其他信息的标签,但我对如何匹配“错误”的部分没有任何线索。

任何人都可以帮助我吗?

回答

2

你只是在寻找字符串“错误:”对不对?

<xsl:when test="contains(text(),'Error:')"> 
</xsl:when> 

如果第一个参数包含第二个参数,则返回true。

+0

那么text()会引用匹配的节点吗?我懂了。谢谢 – daramarak

+1

'text()'具体指的是节点的字符串内容。在大多数情况下,这并不是必要的,但我个人发现在'。'上面使用'text()'一眼就可以更清楚,更容易理解。 – Welbog

+0

我同意,text()更清晰。 – daramarak

2
... 
<xsl:when test="contains(., 'Error')"> 
    <message pri="error"><xsl:value-of select="."/></message> 
</xsl:when> 
...otherwise 
+0

这太好了。这看起来像是我的问题的完整解决方案。 对不起,我不能分裂我的答案... – daramarak

+0

没关系,不客气! – aefxx

+0

一个问题,难道这实际上不会在已匹配的标记中放置一个标记吗? – daramarak

相关问题