我想動態創建具有動態名稱的變量,以便以後在我的轉換中使用,但爲此,我需要動態生成XSL,然後在同一個腳本中運行它。使用XSL生成在同一個腳本中執行的動態XSL?
這只是我正在尋找的一個粗略的僞代碼示例。
我可以使用XSL動態構建XSL以便稍後在同一個腳本中運行嗎?
注意:我們的XML通過運行CL XSL轉換引擎的批處理進程轉換;所以僅僅在XSL文檔中引用XSL樣式表不是一種選擇。
我想動態創建具有動態名稱的變量,以便以後在我的轉換中使用,但爲此,我需要動態生成XSL,然後在同一個腳本中運行它。使用XSL生成在同一個腳本中執行的動態XSL?
這只是我正在尋找的一個粗略的僞代碼示例。
我可以使用XSL動態構建XSL以便稍後在同一個腳本中運行嗎?
注意:我們的XML通過運行CL XSL轉換引擎的批處理進程轉換;所以僅僅在XSL文檔中引用XSL樣式表不是一種選擇。
目前在純XSLT(1.0或2.0)中無法實現。
如果您使用的是Saxon 9.x XSLT processor,有幾個擴展功能可以實現此功能:saxon:compile-stylesheet()和saxon:transform()。
一個問題的解決方案確實需要這樣的功能是非常罕見的,並且很有可能如果您描述問題,人們會發現解決問題的最佳方法,而無需動態生成和執行XSLT樣式表。
XSLT有一個特殊的內置功能,支持生成輸出,它本身就是XSLT。
這是<xsl:namespace-alias>
XSLT指令。
如explaiened通過the XSLT 1.0 Spec:
「
<!-- Category: top-level-element --> <xsl:namespace-alias stylesheet-prefix = prefix | "#default" result-prefix = prefix | "#default" />
樣式表可以使用xsl:namespace-alias
元件來聲明一個命名空間URI是用於另一空間URI的別名當文字的命名空間URI。已被聲明爲另一個名稱空間URI的別名,則結果樹中的名稱空間URI將是名稱空間URI,而文字名稱空間URI是別名,而不是文字名稱空間URI本身。 res綁定到由stylesheet-prefix
屬性指定的前綴的名稱空間URI是綁定到由result-prefix
屬性指定的前綴的名稱空間URI的別名。因此,stylesheet-prefix
屬性指定了將出現在樣式表中的名稱空間URI,並且result-prefix
屬性指定了將出現在結果樹中的相應名稱空間URI。 「
這裏是產生含有xsl:stylesheet
的變換的一個小例子,其在所期望的方式構造的xsl:variable
,:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xxx="my:dummyNS" exclude-result-prefixes="xxx" > <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:namespace-alias result-prefix="xsl" stylesheet-prefix="xxx"/> <xsl:template match="/*"> <xxx:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xxx:variable name="{@name}"> <xsl:value-of select="."/> </xxx:variable> </xxx:stylesheet> </xsl:template> </xsl:stylesheet>
當施加於下面的XML文檔這種轉變:
<v name="myVarName">myValue</v>
想要的結果產生:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:variable name="myVarName">myValue</xsl:variable> </xsl:stylesheet>
那麼下一步將是在你的「腳本」這一動態生成的XSLT轉換推出。
只要運行您的示例,就會得出與您的答案不同的結果。實際上出現的是: ` myValue xxx:variable> xxx:stylesheet>` –
2016-09-08 14:39:33