2011-10-17 46 views
1

我有一個定義了幾個函數的XSL。Java/Saxon:以編程方式運行XSL函數

我想編寫Java代碼,取名字的XSL函數(參數列表)的並運行該功能(和,當然,綁定函數的自變量的形式參數)。

到目前爲止,我所擁有的唯一的解決辦法是產生,在飛行中,與運行所選擇的功能的主模板XSL代碼。這很尷尬。我正在尋找一種解決方案,讓我通過Saxon API直接運行一個函數。

回答

1

XPath Visualizer執行此操作(無論使用的是XSLT處理器)的方式是將主XSL樣式表作爲XML文檔加載,並使用必要的XPath表達式動態修改一個select屬性。

像這樣

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:import href="yourTrueMainStylesheetModule"/> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:variable name="vResult" select="."/> 

<xsl:template match="/"> 
    <xsl:sequence select="$vResult"/> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 
  1. 負載上述樣式表模塊作爲一個如下。

  2. 問題:SelectNodes("/*/xsl:variable[@name='vResult']/@select")

  3. 使用您的DOM API修改選定屬性所需的一個值,說:my:foo(1,2,3)

  4. 啓動使用已經加載的(和動態地修改樣式錶轉換

我已被使用多年我的XPath的可視化工具2(用於XSLT 2.0 - 未發表)作爲命令行 - 樣。口譯FXSL功能,我可以自由地寫:

f:fold(f:mult(), 1, 1 to 4) 

,並得到顯示正確的結果:

24 

這裏是使用XPath展示臺2作爲FXSL解釋的屏幕截圖:

enter image description here

0

你可能無法直接,但不能你只要有呼籲根據您的參數之一不同的模板,就像一個大的switch語句中的主模板。

0

有做這個XQuery的(XQueryEvaluator.callFunction()在s9api包)的API,但沒有可比性XSLT。通過調用低級內部方法的正確序列可能實現它,但您可能必須研究源代碼才能使其運行。

0

XSLT已經具有根據輸入文檔的內容運行不同指令的功能:模板。我相信,如果您已經在運行XSLT,那麼撒克遜的內部API太麻煩了,只需編譯一次這個大的XSLT並重新使用它即可。

只是花時間去了解XSLT和它的功能性質和轉換的功能,模板和右match表達。

我舉個例子。假設我們有兩個輸入XML:

<myxml> 
    <doctype>recipe</doctype> 
    <descr>Bread 'n jam sandwich</descr> 
    <var>jam</var> 
    <var>bread</var> 
</myxml> 

<myxml> 
    <doctype>shoppinglist</doctype> 
    <descr>Monday</descr> 
    <var>honey</var> 
    <var>butter</var> 
    <var>loaf of bread</var> 
    <var>jam</var> 
</myxml> 

現在讓我們假設我們要爲這些XML格式生成正確格式的HTML。第一個XML應該生成一個帶有「Recipe:」和一系列成分的HTML。第二個應該包含一個購物清單。

下面就來同時生成XSLT:

<xsl:stylesheet version="2.0"  
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:saxon="http://saxon.sf.net/" 
    exclude-result-prefixes="xs saxon"> 

<xsl:output method="html" indent="yes"/> 

<!-- Generate basic html --> 
<xsl:template match="/"> 
     <html> 
      <body><xsl:apply-templates /></body> 
     </html> 
</xsl:template> 

<!-- Only call template doctype element, not for vars --> 
<xsl:template match="myxml"> 
    <xsl:apply-templates select="doctype"/> 
</xsl:template> 

<xsl:template match="doctype[.='shoppinglist']"> 
    <h1>Shopping list for <xsl:value-of select="../descr"/></h1> 
    <span><b>Stuff to bring:</b></span> 
    <ul> 
     <xsl:for-each select="../var"> 
      <li><xsl:value-of select="."/></li> 
     </xsl:for-each> 
    </ul> 
</xsl:template> 

<xsl:template match="doctype[.='recipe']"> 
    <h1>Recipe: <xsl:value-of select="../descr"/></h1> 
    <span><b>Ingredients:</b></span> 
    <ul> 
     <xsl:for-each select="../var"> 
      <li><xsl:value-of select="."/></li> 
     </xsl:for-each> 
    </ul> 
</xsl:template> 

</xsl:stylesheet> 

現在看的最後一個模板的match說法。在這種情況下,我根據元素的內容進行挑選,但您可以使用任何您喜歡的XPath篩選器表達式(即根據XML參數進行選擇)。

相關問題