我尝试使用XSLT来显示我得到的一些结果(我的想法是为QWebView生成一个不错的HTML)。
我是XSLT的初学者,我无法知道如何获得以下结果。 (这是一个例子)
输入
<object name="object_name">
<property1 diff="modified">value1</property1>
<property2>value2</property2>
</object>
输出
<p>object_name</p>
<ul>
<li>
property1 = <span style="color : #ff00000 ; font-weight : bold ;">value1</span>
</li>
<li>
property2 = value2
</li>
</ul>
所以我想添加&#34; span&#34;每当我遇到一个&#34; diff&#34;属性(并将样式调整为属性值)
现在,我正在做这样的事情:
<xsl:template match="object">
<p>
<xsl:value-of select="@object_name"/>
</p>
<ul>
<xsl:apply-templates />
</ul>
</xsl:template>
<xsl:template match="object/*">
<li>
<xsl:sequence select="local-name(.)"/> = <xsl:value-of select="."/>
</li>
</xsl:template>
除了&#34; span&#34;我得到了我想要的东西。标签......我无法找到如何让它发挥作用...... 这是我试图编写并插入的代码片段,但没有成功:
<xsl:template match="*[@diff = 'modified']">
<span style="color : #ff0000 ; font-weight : bold ;">iDontKnowWhatToWrite</span>
</xsl:template>
提前感谢任何建议或重定向
编辑:添加精度:感谢在对象/ *匹配中获取属性值匹配的想法,但我想找到一个单独匹配的解决方案,因为我将使用与其他标签相同的匹配。我不知道我是否非常清楚...事实上,这个XSLT将使用我所展示的标签处理XML,但是会有几个不同输出的标签,例如和但是现在我正在做第一种工作,但我希望保持这个&#34; diff&#34;整个文档的属性行为(任何时候遇到它,我都希望将以下内容嵌入&#34; span&#34;标记)
答案 0 :(得分:0)
你可以用这个:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:template match="object">
<p>
<xsl:value-of select="@object_name"/>
</p>
<ul>
<xsl:apply-templates />
</ul>
</xsl:template>
<xsl:template match="object/*">
<li>
<xsl:sequence select="local-name(.)"/> = <xsl:choose>
<xsl:when test="@diff = 'modified'">
<span style="color : #ff00000 ; font-weight : bold ;">
<xsl:value-of select="."/>
</span>
</xsl:when>
<xsl:otherwise><xsl:value-of select="."/></xsl:otherwise>
</xsl:choose>
</li>
</xsl:template>
</xsl:stylesheet>
或者您可以使用此
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:template match="object">
<p>
<xsl:value-of select="@object_name"/>
</p>
<ul>
<xsl:apply-templates />
</ul>
</xsl:template>
<xsl:template match="object/*">
<li>
<xsl:sequence select="local-name(.)"/> = <xsl:value-of select="."/>
</li>
</xsl:template>
<xsl:template match="*[@diff = 'modified']">
<li>
<xsl:sequence select="local-name(.)"/> = <span style="color : #ff00000 ; font-weight : bold ;"><xsl:value-of select="."/></span>
</li>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
正如我在编辑问题中所解释的那样,我需要一个比提议的答案/评论更通用的解决方案。 这是我做的,耦合条件选择/何时/否则结构和模板参数。
<xsl:template match="object">
<p>
<xsl:value-of select="@object_name"/>
</p>
<ul>
<xsl:apply-templates />
</ul>
</xsl:template>
<xsl:template match="object/*">
<li>
<xsl:sequence select="local-name(.)"/> = <xsl:value-of select="."/>
</li>
</xsl:template>
<xsl:template match="*[@diff = 'modified']">
<li>
<xsl:sequence select="local-name(.)"/> =
<xsl:call-template name="processContent">
<xsl:with-param name="contentValue"><xsl:value-of select="."/></xsl:with-param>
<xsl:with-param name="diffAttr"><xsl:value-of select="@diff"/></xsl:with-param>
</xsl:call-template>
</li>
</xsl:template>
<xsl:template name="processContent">
<xsl:param name="contentValue" />
<xsl:param name="diffAttr" select="" />
<xsl:choose>
<xsl:when test="$diffAttr = 'modified'">
<span style="color : #ff0000 ; font-weight : bold ;">
<xsl:value-of select="$contentValue"/>
</span>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$contentValue"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
(这是我最通用的解决方案,因为我可以将此模板重用于其他标签,我甚至可以轻松地将其扩展到其他diff属性值)