2009-08-03 28 views
3

我創建了一個模板,它基於單個字符串生成輸出,通過參數傳遞,並且不使用輸入XML文檔。 xsltproc似乎很高興地使用指定樣式表的單個參數運行,但我沒有看到在沒有輸入文件的情況下觸發模板的方式(例如,運行命名模板的xsltproc沒有參數)。XSLT:如何在沒有輸入文件時觸發模板?

我希望能夠運行:

xsltproc --stringparam bar baz foo.xsl 

但我目前有運行,與「主」模板匹配「/」:

echo '<xml/>' | xsltproc --stringparam bar baz foo.xsl - 

哪有我得到這個工作?我確定過去看過其他模板,這些模板都是在沒有輸入文檔的情況下運行的,但我不記得它們是如何工作的或者在哪裏再次找到它們。 :-)

+0

接受的答案是不正確的。詳情請參閱我的回答。 – 2009-08-17 18:43:50

+0

我已經更新了我的答案,以顯示如何在實踐中使用此XSLT 1.0技術。 – 2009-08-17 23:30:38

回答

8

實際上,這已經經常進行。

XSLT 2.0它是規範中定義的。提供初始上下文節點是可選的。 如果沒有提供初始上下文節點(沒有源XML文檔),那麼提供將作爲轉換的入口點執行的命名模板的名稱很重要。

XSLT 1.0一個可提供給變換其自己的主樣式表模塊(文件)作爲源的XML文檔,當然,轉換可以完全忽略這個源的XML文檔。這種技術早已被Jeni Tennison所證明和使用。

例如:

<?xml-stylesheet type="text/xsl" href="example.xml"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <p>Hello, world!</p> 
    </xsl:template> 
</xsl:stylesheet> 

當上面的代碼保存在一個名爲「的example.xml」,然後將文件夾的內容文件顯示在Windows Explorer中,雙擊文件「的例子.xml「將打開IE並生成:

你好,世界!

1

通常情況下,您不能用XSLT來做到這一點 - 規範要求有一個輸入文檔,並且要處理從將任何可用模板應用到其根節點開始。一些XSLT處理器可能會給出一種方法來做你想做的事情(例如執行一個命名模板)作爲擴展,但我不知道這樣做,並且從它的手冊頁判斷xsltproc似乎並不是它們中的一個。

實際上,這聽起來很可疑,因爲使用XSLT從純字符串輸入生成某些輸出的目的尚不清楚 - 這不是它通常擅長的那種任務。

+0

+1 - 如果甚至沒有根節點,則呼叫模板或應用模板無法匹配。 – 2009-08-04 17:42:38

相關問題