2017-09-14 52 views
0

我正在放置一個簡單的XSL樣式表,以便同事可以預覽他們在瀏覽器中編輯的XML。 一個元素有許多不同的屬性值,每個屬性值需要以不同的方式呈現。根據屬性值差異設置元素的格式

<hi rend="b"> 

需要大膽,

<hi rend="b i"> 

需求是粗體和斜體,等等。

XSL需要做什麼才能做到這一點?

我已經做了大量的谷歌搜索,還沒有找到解決方案,也許這是一個非常基本的問題,但非常感激地收到任何幫助。

+0

好,這你使用的是XSLT的版本,'rend'屬性值的語言有多複雜?您是否考慮過更改XML格式以使用元素' ...'爲標記? –

+0

非常感謝Martin:您會看到另一位評論者提供了我需要的解決方案。有關信息,不直接在XML中使用這些元素的原因是數據處於受控架構中,需要hi元素來處理文本效果。 –

回答

2

因爲你寫了你的同事在他們的瀏覽器中預覽XML,我假設你期望XSLT-1.0解決方案。以下模板將複製hi元素,並用bi標記替換該屬性。瀏覽器忽略複製的hi標籤。

但是,在此解決方案中,您必須創建每個屬性值的組合。

<xsl:template match="hi[contains(@rend,'i')]"> 
    <xsl:copy> 
     <i><xsl:apply-templates /></i> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="hi[contains(@rend,'b')]"> 
    <xsl:copy> 
     <b><xsl:apply-templates /></b> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="hi[contains(@rend,'i') and contains(@rend,'b')]"> 
    <xsl:copy> 
     <i><b><xsl:apply-templates /></b></i> 
    </xsl:copy> 
</xsl:template> 

輸出:

<hi><i><b> 
    ...3... 
</b></i></hi>  

<hi><i> 
    ...1... 
</i></hi> 

<hi><b> 
    ...2... 
</b></hi> 
+0

非常感謝@ zx485。這是一個很好的解決方案,並且我沒有足夠的組合來添加每個作爲新模板匹配都沒有問題。 –

1

從@ zx485需要4個模板,如果有2種款式,8,如果有3個,16個,如果有4個解決辦法:這不是很可擴展性。

爲了比較這裏是一個XSLT 3.0解決方案(你可以在撒克遜JS運行),將處理一個完全開放式的樣式集:

<xsl:function name="f:render" as="element()"> 
    <xsl:param name="e" as="element()"/> 
    <xsl:param name="styles" as="xs:string*"/> 
    <xsl:choose> 
    <xsl:when test="empty($styles)"> 
     <xsl:copy select="$e"> 
     <xsl:copy-of select="@* except @rend"/> 
     <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:element name="{head($styles)}"> 
     <xsl:sequence select="f:render($e, tail($styles))"/> 
     </xsl:element> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:function> 

然後

<xsl:template match="*[@rend]"> 
    <xsl:sequence select="f:render(., tokenize(@rend))"/> 
</xsl:template> 
相關問題