我正在放置一個簡單的XSL樣式表,以便同事可以預覽他們在瀏覽器中編輯的XML。 一個元素有許多不同的屬性值,每個屬性值需要以不同的方式呈現。根據屬性值差異設置元素的格式
<hi rend="b">
需要大膽,
<hi rend="b i">
需求是粗體和斜體,等等。
XSL需要做什麼才能做到這一點?
我已經做了大量的谷歌搜索,還沒有找到解決方案,也許這是一個非常基本的問題,但非常感激地收到任何幫助。
我正在放置一個簡單的XSL樣式表,以便同事可以預覽他們在瀏覽器中編輯的XML。 一個元素有許多不同的屬性值,每個屬性值需要以不同的方式呈現。根據屬性值差異設置元素的格式
<hi rend="b">
需要大膽,
<hi rend="b i">
需求是粗體和斜體,等等。
XSL需要做什麼才能做到這一點?
我已經做了大量的谷歌搜索,還沒有找到解決方案,也許這是一個非常基本的問題,但非常感激地收到任何幫助。
因爲你寫了你的同事在他們的瀏覽器中預覽XML,我假設你期望XSLT-1.0解決方案。以下模板將複製hi
元素,並用b
和i
標記替換該屬性。瀏覽器忽略複製的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>
非常感謝@ zx485。這是一個很好的解決方案,並且我沒有足夠的組合來添加每個作爲新模板匹配都沒有問題。 –
從@ 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>
好,這你使用的是XSLT的版本,'rend'屬性值的語言有多複雜?您是否考慮過更改XML格式以使用元素' ...'爲標記? –
非常感謝Martin:您會看到另一位評論者提供了我需要的解決方案。有關信息,不直接在XML中使用這些元素的原因是數據處於受控架構中,需要hi元素來處理文本效果。 –