2017-08-29 46 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> 

(這是對我來說最通用的解決方案,我將能夠重複使用這個模板的其他標籤,我甚至可以輕鬆地擴展它到其他差異的屬性值)

相關問題