2016-09-21 123 views
3

我需要執行XML XSLT轉換。我對此很陌生,並且閱讀了很多教程,但遇到了一些對我而言有挑戰性的問題,希望有人能指引我朝着正確的方向前進。XSLT轉換

我有兩個元件,例如:

<linum class="topic/linum secondAtt/secondVal">Blah</linum> 
<linum class="topic/linum">Blah</linum> 

如果亞麻類屬性具有第二值,我必須添加另一個屬性,以使用該屬性的第二值該元素。如果它只有一個,我會保持原樣。

所以輸出爲上述兩個輸出將是:

<linum class="topic/linum secondAtt/secondVal" newAttribute="secondVal">Blah</linum> 
<linum class="topic/linum">Blah</linum> 

我希望我已經很好地解釋了這一點,如果沒有希望,因爲只有第一個元素是通過添加新的屬性改變了我變清與第二個值。

我很感謝我給予的任何幫助!

+0

究竟做「具有第二值」是什麼意思?我在兩個方面都只看到一個價值。 –

+0

第一個元素class value =「topic/linum secondAtt/secondVal」 第二個元素class value =「topic/linum」 第一個元素有兩個值,主題linum和secondAtt/secondVal。第二個元素只有一個,主題/ linum。 如果元素有兩個值,我需要獲得第二個值的第二部分,並將其作爲新屬性添加到同一元素,如我的輸出示例中所示 – HelpMeWithXSLT

+0

是否可以有第三個「值」?如果是,在這種情況下結果應該如何? –

回答

1

下面將爲您例如,在class屬性包含不超過兩個空間分隔的值工作:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="linum[contains(@class, ' ')]"> 
    <linum class="{@class}" newAttribute="{substring-after(substring-after(@class, ' '), '/')}"> 
     <xsl:apply-templates/> 
    </linum> 
</xsl:template> 

</xsl:stylesheet> 
+0

感謝您對邁克爾的迴應,非常感謝。今天我會試試這個,並在有機會時報告。 – HelpMeWithXSLT

+0

這就像一個魅力,感謝邁克爾! – HelpMeWithXSLT