2017-08-29 32 views
0

我正在尝试使用XSLT来显示我作为XML(想法为QWebView生成体面的HTML)所得到的一些结果。在XSLT中的属性值中插入标签

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

所以我想添加一个 “跨度” 标签,每当我遇到一个 “差异” 属性(和适应风格属性值)

现在,我正在做这样的事情:

<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']"> 
    <span style="color : #ff0000 ; font-weight : bold ;">iDontKnowWhatToWrite</span> 
</xsl:template> 

预先感谢任何忠告或重定向

编辑:添加精度:感谢您与对象/ *匹配的属性值匹配的想法,但我希望找到一个单独的匹配解决方案,因为我将使用它匹配其他标签...

我不知道我是否非常清楚......实际上,这个XSLT将使用类似于我所展示的标签来处理XML,但会有几个标签具有不同的输出,就像,但现在我正在处理第一类,但我希望保持整个文档的这个“差异”属性行为(任何时候遇到,我想将以下内容嵌入到“span”标记中)

+0

为什么不你在'span'元素的内部放置了'? –

回答

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> 
+0

谢谢!我实际上编辑了我的帖子,因为我可以做到这一点,但我正在寻找一个更“通用”的解决方案,我可以重复使用其他标签......也许是一个带参数的模板? (我刚刚了解这种可能性) – Manu310

+0

好吧,谢谢!我实际上使用了你的第一个命题和模板参数的混合。我将在下面发布我的解决方案 – Manu310

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> 

(这是对我来说最通用的解决方案,我将能够重复使用这个模板的其他标签,我甚至可以轻松地扩展它到其他差异的属性值)

相关问题