2008-12-10 62 views
5

我想動態創建具有動態名稱的變量,以便以後在我的轉換中使用,但爲此,我需要動態生成XSL,然後在同一個腳本中運行它。使用XSL生成在同一個腳本中執行的動態XSL?

這只是我正在尋找的一個粗略的僞代碼示例。

​​

我可以使用XSL動態構建XSL以便稍後在同一個腳本中運行嗎?

注意:我們的XML通過運行CL XSL轉換引擎的批處理進程轉換;所以僅僅在XSL文檔中引用XSL樣式表不是一種選擇。

回答

1

目前在純XSLT(1.0或2.0)中無法實現。

如果您使用的是Saxon 9.x XSLT processor,有幾個擴展功能可以實現此功能:saxon:compile-stylesheet()saxon:transform()

一個問題的解決方案確實需要這樣的功能是非常罕見的,並且很有可能如果您描述問題,人們會發現解決問題的最佳方法,而無需動態生成和執行XSLT樣式表。

14

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轉換推出。

+0

只要運行您的示例,就會得出與您的答案不同的結果。實際上出現的是: ` myValue` – 2016-09-08 14:39:33