2012-06-26 138 views
3

我想從XSLT樣式表動態生成XSLT文檔。原則上,這當然有效,但我沒有得到命名空間的工作。我想有生成的XSLT元素與「XSL」前綴前綴:從XSL創建XSL

<xsl:stylesheet ...> 

而不是

<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform"> 

我=的「」 XSL命名空間發揮各地:元素與XSL:命名空間但我沒有得到它的工作(xslt2 /撒克遜可用)

任何提示?

回答

3

如果您想使用XSLT創建XSLT代碼,那麼使用http://www.w3.org/TR/xslt20/#element-namespace-alias可以幫助例如

<xsl:stylesheet 
    version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fo="http://www.w3.org/1999/XSL/Format" 
    xmlns:axsl="file://namespace.alias"> 

<xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/> 

<xsl:template match="/"> 
    <axsl:stylesheet version="2.0"> 
    <xsl:apply-templates/> 
    </axsl:stylesheet> 
</xsl:template> 

<xsl:template match="elements"> 
    <axsl:template match="/"> 
    <axsl:comment select="system-property('xsl:version')"/> 
    <axsl:apply-templates/> 
    </axsl:template> 
</xsl:template> 

<xsl:template match="block"> 
    <axsl:template match="{.}"> 
    <fo:block><axsl:apply-templates/></fo:block> 
    </axsl:template> 
</xsl:template> 

</xsl:stylesheet> 
+0

你好,謝謝你,這是解決方案!但正如我發現的那樣,也可以使用「xsd」本身(請參閱我的解決方案)。那有什麼不對嗎? – divB

+1

在你的評論中你說「使用」xsd「本身」,我想你的意思是'xsl',而不是'xsd'。至於你的文章做了',如果你想用這種方式,你可以做到這一點,但我更喜歡寫文字結果元素和屬性,只要我不需要動態地計算節點名稱,並且這種使用名稱空間別名的方式允許我繼續編寫文字結果元素和屬性,而不是使用更繁瑣和更羅嗦的'xsl:element'和/或'xsl:attribute'。所以爲了簡潔和優雅,我強烈建議使用命名空間別名。 –

1

我找到了解決辦法:

<xsl:element name="xsl:stylesheet"> 
</xsl:element> 

做工作! (即避免使用namespace =「」,但明確列出名稱空間前綴)

+1

如果您真的想學習一些東西 - 這是SO的主要目的 - 然後遵循更簡單和標準的XSLT生成樣式表的方式 - 正如我在答案和Martin Honnen中所推薦的那樣。 –

+0

適用於不支持xsl:namespace-alias的XSLT處理器的良好解決方法,例如Transformiix –